hdu1176 免费馅饼(简单DP)

来源:互联网 发布:匿了网络用语 编辑:程序博客网 时间:2024/05/12 11:03

和数塔类似,只不过顶点换成了该人的起点。

状态方程:dp[i][j] = max(dp[i + 1][j - 1], dp[i + 1][j], dp[i + 1][j + 1]) + a[i][j]。

注意0和10的特殊情况。

还要注意= =,codeblock似乎无法承受N = 100005的数据量,但oj可以A掉。。。

#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;const int N = 100005;int main(){  //  freopen("in.txt", "r", stdin);    int x, T, i, j, m, maxt;    int dp[N][15], a[N][15];    while(~scanf("%d", &m) && m)    {        maxt = 0;        memset(dp, 0, sizeof(dp));        memset(a, 0, sizeof(a));        for(i = 0; i < m; i ++)        {            scanf("%d%d", &x, &T);            a[T][x] ++;            maxt = max(maxt, T);        }        for(i = maxt; i >= 0; i --)            for(j = 0; j < 11; j ++)            {                if(j == 0) dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + a[i][j];                else if(j == 10) dp[i][j] = max(dp[i + 1][j - 1], dp[i + 1][j]) + a[i][j];                else dp[i][j] = max(dp[i + 1][j - 1], max(dp[i + 1][j], dp[i + 1][j + 1])) + a[i][j];            }        printf("%d\n", dp[0][5]);    }    return 0;}


0 0
原创粉丝点击