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
[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; }
相关文章推荐
- HDU 4293 Groups (线性dp)
- HDU 4293 Groups (线性dp)
- HDU 4293 Groups
- hdu 4293 Groups
- hdu 4293 Groups
- HDU 4293 Groups 区间覆盖 区间DP
- hdu 4293 Groups
- HDU 4293Groups(DP)
- HDU 4293 Groups【区间dp】
- hdu 4293 Groups
- HDU 4293 Groups (dp)
- hdu 4293 Groups
- HDU 4293 Groups(dp)
- Groups - HDU 4293 dp
- hdu 4293 Groups (2012 ACM/ICPC Asia Regional Chengdu Online)
- HDU 4293 Groups(12年成都网络赛-F题-DP)
- HDU 4293--Groups
- HDU 4293 Groups
- HDU 4293 Groups
- HDU 4293 Groups