看到网上大多都是逆向的总结,我来搞个正向的吧...
这道题想着是和数字三角形差不多的,但是最后愣是没有写出来,感受到一股菜意......哭唧唧.jpg
本题大意:
给定n个序列,每个序列包含两个数表示第t s时坐标x有食物下落,初始时人在坐标为5的位置,人每秒只能移动一个单位,当所有食物下落后,问人能捡到的最大食物数。
本题思路:
和数字三角形是一个思路的问题,很容易可以推导出状态转移方程为dp[i][j] += maxx(dp[i - 1][j - 1], dp[i - 1][j], dp[i - 1][j + 1]),好吧我承认很简单我很笨....
参考代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = 1e5 + ;
int n, x, t, ans, maxt;
int dp[maxn][]; int maxx(int a, int b, int c) {
int cnt = a > b ? a : b;
cnt = cnt > c ? cnt : c;
return cnt;
} int main () {
while(cin >> n && n) {
maxt = ans = ;
memset(dp, , sizeof dp);
for(int i = ; i < n; i ++) {
cin >> x >> t;
if(maxt < t) maxt = t;
dp[t][x] ++;
}
for(int i = ; i <= maxt; i ++) {
for(int j = ; j < ; j ++) {
dp[i][j] += maxx(dp[i - ][j - ], dp[i - ][j], dp[i - ][j + ]);
ans = max(ans, dp[i][j]);
}
}
printf("%d\n", ans);
}
return ;
}
...有大佬可能会说,辣鸡,我的maxx是max(max())....呜呜呜,我很辣鸡.jpg