У меня трудности с решением проблемы из моего класса, речь идет о динамическом программировании (или так назвал мой профессор). Проблема называется «Хит водопада». (Ограничение по времени: 1 с, ограничение по памяти: 16 МБ)
Нам даны верхняя левая (v1, h1) и нижняя правая координаты (v2, h2) камня, и мы моделируем водопад и подсчитываем количество камней, попавших под воду, представьте, что вода начала падать с координаты (x, y), он упадет до (x-1, y) и продолжит падать, пока не достигнет скалы. когда он попадает в скалу, вода будет расщепляться вправо и влево и следовать длине скалы, вот изображение того, как будет работать алгоритм.
Имитация изображения .
Что нам нужно посмотреть здесь, если камень ударил более одного раза, проблема также гарантировала, что камни не будут прилипать друг к другу, и вода всегда найдет путь через любые 2 камня.
Вот фрагмент моего неполного кода, где я все еще думаю о втором условии, когда вода попадает в скалу и предотвращает двойной счет.
int maks=0, n, m, nstone;
struct a{
int v1, v2, h1, h2; //coordinates
bool pass; //passed or not?
}; a arr[5000];
bool acompare(a lhs, a rhs){
return lhs.v1 < rhs.v1; //compare height descending
}
int fall(int x, int y){
if (x == n || y == m || y == -1) //if the water passed the wall
return 0;
else if () //the confusing condition if the water hit the rock
return 1 + fall(x, h1-1) + fall(x, h2+1));
else // if there's nothing below
return fall(x-1, y);
}
int main(){
cin>> n>> m>> nstone; //waterfall size (n*m) and number of stone
for (int i=0; i<nstone; i++){ //read the stone's corner
cin>> arr[i].v1>> arr[i].h1>> arr[i].v2>> arr[i].h2;
arr[i].pass = false;
}
sort(arr, arr+nstone, acompare); //sort the stone's based on height
cin>> start; //read the start point of the water
cout<< fall(start, m)<< endl;
return 0;
}
Пример ввода теста:
6 6 3
2 3 2 4
4 2 5 2
5 5 6 5
вывод:
3