您的位置:首页 > 其它

HDU 4293 Groups

2012-09-18 09:38 330 查看
题意: 有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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: