HDU-1176免费馅饼(二维DP)

由于数轴1E1所以构建dp[time][location]和v[time][location]存储馅饼掉落时间和位置
状态转移方程:
dp[i][j]=max(max(dp[i-1][j-1]+v[i][j],dp[i-1][j]+v[i][j]),dp[i-1][j+1]+v[i][j]);
由于初始点=5,所以

dp[1][4]=v[1][4];
dp[1][5]=v[1][5];
dp[1][6]=v[1][6];

注意一下二重循环j的取值
AC代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=1E5+5;
const int INF=1<<30;
int dp[maxn][12];
int v[maxn][12];
int main ()
{
    int a,b,n,ans;
    while (~scanf ("%d",&n))
    {
        if (n==0)
            break;
        memset (dp,0, sizeof(dp));
        memset (v,0, sizeof(v));
        for (int i=1;i<=n;i++)
        {
            scanf ("%d%d",&a,&b);
            v[b][a]++;
        }
        dp[1][4]=v[1][4];
        dp[1][5]=v[1][5];
        dp[1][6]=v[1][6];
        for (int i=2;i<=maxn;i++)
            for (int j=0;j<=11;j++)
            {
                if (j==0)
                    dp[i][j]=max(dp[i-1][j]+v[i][j],dp[i-1][j+1]+v[i][j]);
                else if (j==11)
                    dp[i][j]=max(dp[i-1][j]+v[i][j],dp[i-1][j-1]+v[i][j]);
                else
                    dp[i][j]=max(max(dp[i-1][j-1]+v[i][j],dp[i-1][j]+v[i][j]),dp[i-1][j+1]+v[i][j]);
            }
        ans=0;
        for (int i=0;i<=11;i++)
            ans=max(ans,dp[maxn][i]);
        printf ("%d\n",ans);
    }
    return 0;
}
发布了33 篇原创文章 · 获赞 16 · 访问量 927

猜你喜欢

转载自blog.csdn.net/weixin_43925900/article/details/96349218
今日推荐