HDU 4293 Groups(线性)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4293

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

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

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

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

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

 

View Code
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #define max(x,y) ((x)>(y)?(x):(y))

 5 using namespace std;

 6 

 7 

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

 9 

10 void DP()

11 {

12     int i,j;

13     for(i=1;i<=n;i++)

14     {

15         dp[i]=dp[i-1];

16         for(j=1;j<=i;j++) dp[i]=max(dp[i],dp[j-1]+a[j][i]);

17     }

18 }

19 

20 

21 int main()

22 {

23     while(scanf("%d",&n)!=EOF)

24     {

25         memset(a,0,sizeof(a));

26         int x,y,i,s,e;

27         for(i=0;i<n;i++)

28         {

29             scanf("%d%d",&x,&y);

30             if(x+y>=n) continue;

31             s=x+1,e=n-y;

32             if(a[s][e]<n-x-y) a[s][e]++;

33         }

34         DP();

35         printf("%d\n",dp[n]);

36     }

37     return 0;

38 }

 

 

 

你可能感兴趣的:(group)