Hdu 4293 DP

题意:

n个人说自己前面有多少人 后面有多少人

求出说真话人数最多的情况 

每个样例有 一个 n 表示n个人

接下来 n 行有a b 表示他前面的人数和后面的人数

 

思路:

如果已经知道了其中一组的人数~

就往前找..找在这一组之前与这一组的话不矛盾的最多人数

 

Tips:

用dp[ i ][ j ] 表示从第 i+1 个人到第 j 个人为一组的时候前j个人中说真话最多的人

用tt[ i ][ j ] 表示从第 i 个人到第 j 个人之间站了多少人

用an[ i ]表示到第 i 个人前面说真话的人最多人数

 

tt[ a ][ b ]的人数不应该多于 n-(b-a+1) 

Code:

View Code
 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int dp[510][510];    
 7 int tt[510][510], an[510];
 8 
 9 int main()
10 {
11     int i, j, k;
12     int n, a, b;
13     while(scanf("%d", &n) != EOF)
14     {
15         memset(dp, 0, sizeof(dp));
16         memset(an, 0, sizeof(an));
17         memset(tt, 0, sizeof(tt));
18 
19         for(i = 0; i < n; ++i) {
20             scanf("%d %d", &a, &b);
21             if(a+b < n && tt[a][n-b] < (n-a-b))
22                 tt[a][n-b]++;
23         }
24 
25         for(i = 1; i <= n; ++i)
26         for(j = 0; j < i; ++j) {
27             dp[j][i] = an[j]+tt[j][i];
28             an[i] = max(an[i], dp[j][i]);
29         }
30 
31         printf("%d\n", an[n]);
32     }
33     return 0;
34 }

 

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

posted @ 2012-09-18 23:54  Griselda.  阅读(507)  评论(0编辑  收藏  举报