HDU 4293 Groups

题意: 有n 个人走在一条路上,其中一些人可能是一个组的,每个人都说出了自己所在组前方的人数和后方的人数,问最多有多少人说的是真话。

分析: dp[i][j]  表示从第 i +1 个人到第 j 个人为一组时的最优值

          t[i][j]    表示描述中从第 i +1 个人到第 j 个人为一组的数量

          注意的是: t[i][j]的值不可能超过 n-(j-i+1)

          s[i]       保存以第 i 个人为结尾的最优值

          转移方程: dp[i][j]=s[i]+t[i][j]

                         s[j] = max (s[j],dp[i][j])

 

#include<stdio.h>
#include<string.h>
#define clr(x)memset(x,0,sizeof(x))
#define max(a,b)(a)>(b)?(a):(b)
#define maxn 505
int dp[maxn][maxn];
int t[maxn][maxn];
int s[maxn];
int main()
{
    int n,i,j;
    while(scanf("%d",&n)!=EOF)
    {
        int a,b;
        clr(dp);
        clr(t);
        clr(s);
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&a,&b);
            if(a+b<n&&t[a][n-b]<n-a-b)
                t[a][n-b]++;
        }
        for(j=1;j<=n;j++)
            for(i=0;i<j;i++)
            {
                dp[i][j]=s[i];
                dp[i][j]+=t[i][j];
                if(dp[i][j]>s[j])
                    s[j]=dp[i][j];
            }
        printf("%d\n",s[n]);
    }
    return 0;
}

 

posted @ 2012-09-18 09:38  'wind  阅读(201)  评论(0编辑  收藏  举报