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 }