标签:动态规划
6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
题意:每一次只能移动一步,那么我们可以考虑到如果考虑在该位置第i秒的最优解,是要考虑第i+1秒该位置左右和该位置三者之中最大的,之后就是动态规划。
dp[i][j] = max(dp[i+1][j], dp[i+1][j], dp[i+1][j-1]
代码:
#include <cstdio> #include <cstring> #include <algorithm> #define M 100005 using namespace std; int dp[M][11]; /*int max(int a, int b){ if(a < b) return b; return a; }*/ int main(){ int n; while(scanf("%d", &n), n){ int maxt = 0, i, j, t, x; memset(dp, 0, sizeof(dp)); for(i = 0; i < n; i ++){ scanf("%d%d", &x, &t); dp[t][x]++; maxt = max(maxt, t); } for(i = maxt-1; i >= 0; i --){ int temp; for(j = 0; j < 11; j ++){ temp = 0; if(j == 0) temp = max(dp[i+1][j], dp[i+1][j+1]); else if(j == 10){ temp = max(dp[i+1][j], dp[i+1][j-1]); } else temp = max(max(dp[i+1][j], dp[i+1][j+1]), dp[i+1][j-1]); dp[i][j] += temp; } } printf("%d\n", dp[0][5]); } return 0; }
标签:动态规划
原文地址:http://blog.csdn.net/shengweisong/article/details/40086595