您的位置:首页 > 其它

HDU 4293 Groups(线性)

2012-09-21 11:11 477 查看
[b]题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4293[/b]

[b]题意:n个人排成一排。这些人分成了若干个组(同一组的人肯定是相邻的)。现在这n个人每个人说出自己这一组前面和后面[/b]

[b]分别有多少人。问这些人中最多有几个人说的是对的?[/b]

[b]思路:比赛的时候一点思路没有啊。。。中途有人建议说跟POJ3680一样构造最大流,我试了一下超时。。。最后还是DP啊,[/b]

[b]根据每个人说的话,可以确定一个这个人所在组的区间[i,j],a[i][j]表示[i,j]这个组的人有a[i][j]个。设dp[i]表示前i个人[/b]

[b]最多的真话数,则dp[i]=max(dp[i],dp[j-1]+a[j][i])。。。DP这个东西真是强悍啊。。。[/b]

View Code

#include <iostream>
#include <cstdio>
#include <cstring>
#define max(x,y) ((x)>(y)?(x):(y))
using namespace std;

int a[505][505],dp[505],n;

void DP()
{
int i,j;
for(i=1;i<=n;i++)
{
dp[i]=dp[i-1];
for(j=1;j<=i;j++) dp[i]=max(dp[i],dp[j-1]+a[j][i]);
}
}

int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
int x,y,i,s,e;
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
if(x+y>=n) continue;
s=x+1,e=n-y;
if(a[s][e]<n-x-y) a[s][e]++;
}
DP();
printf("%d\n",dp
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: