标签:
这道题是数塔变形:
5 i = 0;
5 6 7 i = 1;
4 5 6 7 8 i = 2;
3 4 5 6 7 8 9 i = 3;
2 3 4 5 6 7 8 9 10 i = 4;
1 2 3 4 5 6 7 8 9 10 11 i = 5;
1 2 3 4 5 6 7 8 9 10 11 i = 6;
。。。。。。。。。。。。 。。。
状态转移方程:dp[i][j] += max(max(dp[i+1][j-1], dp[i+1][j+1]), dp[i+1][j]);
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; const int N=100010; const int INF=0x3f3f3f3f; int dp[N][20]; int main () { int n, i, j, M, x, T; while (scanf("%d", &n), n) { memset(dp, 0, sizeof(dp)); M = -INF; for (i = 1; i <= n; i++) { scanf("%d%d", &x, &T); M = max(M, T); dp[T][x+1]++; ///为了防止数组越界,将每个位置加1 } for (i = M; i >= 0; i--) ///让时间为行,位置为列 { for (j = 1; j <= 11; j++) dp[i][j] += max(max(dp[i+1][j-1], dp[i+1][j+1]), dp[i+1][j]); ///只能从左右到达该点或者是在该点不动,比较三者大小,取最大值 } printf("%d\n", dp[0][6]); ///初始位置是6,时间为0 } return 0; }
标签:
原文地址:http://www.cnblogs.com/syhandll/p/4779980.html