链接:http://hdu.hustoj.com/showproblem.php?pid=1176
第0秒 5
第1秒 4 5 6
第2秒 3 4 5 6 7
第3秒 2 3 4 5 6 7 8
第4秒 1 2 3 4 5 6 7 8 9
第5秒 0 1 2 3 4 5 6 7 8 9 10
第6秒 ……
从最后一秒向前推,可得状态方程:
f[i][j] += man(f[i + 1][j], f[i + 1][j - 1], f[i + 1][j + 1]);
最后直接输出f[0][5]即可
同理,从第0 秒向后推,可得状态方程:
f[i][j] += man(f[i - 1][j], f[i - 1][j - 1], f[i - 1][j + 1]);
最后输出需要判断0-10位置上的最大值,然后输出
错误原因:f[]数组初始化范围小了。。。成了0-n,wa了无数次终于发现了,,,
倒推代码:
#define _CRT_SBCURE_MO_DEPRECATE #include<iostream> #include<stdlib.h> #include<stdio.h> #include<cmath> #include<algorithm> #include<string> #include<string.h> #include<set> #include<queue> #include<stack> #include<functional> using namespace std; const int maxn = 100000 + 10; const int INF = 0x3f3f3f3f; int n; int x, t; int m; int f[maxn][20]; int mank(int a, int b, int c) { if (a >= b &&a >= c)return a; if (b >= a &&b >= c)return b; if (c >= a &&c >= b)return c; } int main() { while (scanf("%d", &n) != EOF && n) { for (int i = 0; i <= maxn; i++) { for (int j = 0; j <= 15; j++) f[i][j] = 0; } m = 0; while (n--) { scanf("%d %d", &x, &t); f[t][x+1]; m = max(t, m); } for (int i = m-1; i >= 0; i--) { for (int j = 1; j <= 11;j++) { f[i][j] += mank(f[i + 1][j], f[i + 1][j - 1], f[i + 1][j + 1]); } } printf("%d\n", f[0][5]); } system("pause"); return 0; }
