现在的位置: 首页 > 综合 > 正文

hdu1176数轴上的免费馅饼

2013年02月20日 ⁄ 综合 ⁄ 共 1409字 ⁄ 字号 评论关闭

//同样是一个DP的简单入门的题目..想了很久..不过想出来了的感觉真的很好...
//之于状态..最开始一直去想..存在的状态.就只有时间啊..就是第i秒的最优值..
//后来发现..如果这样去考虑的话..并不满足最优子结构原理..即我的最有策略中.第i次不一定是最有的.
//就发现可能是状态考虑错了..后来受到了数字三角的启发..想到,可以用dp[i][j]表示第i秒的时候人在第j位

//能够产生的最优解.

//状态转移方程就是dp[i][j] = max(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])当然.这里在0和10的地方就要少一个.

//大概意思是这样子的.

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<vector>
const int inf = 0x3f3f3f;
const int MN = 110100;
using namespace std;
int x,t,dp[MN][12],n,vis[MN][12];
int main()
{
    while(scanf("%d",&n) && n != 0)
    {
        int maxx = -inf;
        memset(vis,0,sizeof(vis));
        for(int i = 1 ; i <= n ; i++)
        {
            scanf("%d%d",&x,&t);
            vis[t][x]++;
            maxx = max(maxx,t);
        }
        memset(dp,0,sizeof(dp));
        if(vis[1][4])dp[1][4] = vis[1][4];
        if(vis[1][5])dp[1][5] = vis[1][5];
        if(vis[1][6])dp[1][6] = vis[1][6];
        for(int i = 2 ; i <= maxx ; i++)
        {
            for(int j = 0 ; j <= 10 ; j++)
            {
                if(j != 0 && j != 10)
                {
                    dp[i][j] = max( dp[i-1][j],dp[i-1][j-1] );
                    dp[i][j] = max( dp[i][j],dp[i-1][j+1] );
                }
                else
                {
                    if(j == 0)
                    {
                        dp[i][j] = max( dp[i-1][j],dp[i-1][j+1] );
                    }
                    else
                    {
                        dp[i][j] = max( dp[i-1][j],dp[i-1][j-1] );
                    }
                }
                if(i >= abs(j - 5))
                  dp[i][j] += vis[i][j];
            }
        }
        int ans = -inf;
        for(int i = 0 ; i <= 10 ; i++)
        {
            if(ans < dp[maxx][i])
              ans = dp[maxx][i];
        }
        printf("%d\n",ans);
    }
}

抱歉!评论已关闭.