hdu4293Groups dp

来源:互联网 发布:php文件管理插件 简洁 编辑:程序博客网 时间:2024/03/29 08:30
//n个人,每个人说出在他所在组前面的人的个数a和在他组后面的人的个数b//其中有些人说真话有些人说假话,问最多有多少有多少个人说真话//对于每个人所说的话,可以推测他所在区间为[a+1,n-b]//可以用dp[i] 表示右区间到i得到的最大的说真话的人的个数//用map[i][j]表示右区间为i其左区间前面一个数为j的人的个数#include<cstdio>#include<cstring>#include<iostream>#include<vector>using namespace std ;const int maxn = 510 ;int map[maxn][maxn] ;int dp[maxn] ;int main(){    int n ;    while(~scanf("%d" , &n))    {        int a , b ;        memset(map , 0 , sizeof(map)) ;        for(int i = 1;i <= n;i++)        {            scanf("%d%d" , &a , &b) ;            if((a+b+1) > n)continue ;            if(n-b <= a)continue ;            if(map[n-b][a] == (n-b-a))continue ;            map[n-b][a]++ ;        }        dp[0] = 0 ;        for(int i = 1;i <= n;i++)        {            dp[i] = 0 ;            for(int j = 0;j < i;j++)            dp[i] = max(dp[j]+map[i][j] , dp[i]) ;        }        cout<<dp[n]<<endl;    }    return 0 ;}
0 0