码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4293 Groups (线性dp)

时间:2014-07-09 17:35:02      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   strong   2014   

OJ题目:click here~~

题目分析:n个人分为若干组 , 每一个人描写叙述其所在的组前面的人数和后面的人数。求这n个描写叙述中,最多正确的个数。

设dp[ i ] 为前i个人的描写叙述中最多正确的个数,则dp[ n ] 为要求的。num[ i ][ j ]  保存说前面有i个人 , 后面有j个人的人数,显然num[ i ][ j ]不超过n - i - j;

转移方程dp[ i ] = max(dp[ i ] , dp[ j ]  + num[ j ][ n - i ])  ,详解见代码凝视。

AC_CODE

int num[502][502];
int dp[502];
int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    while(cin >> n){
        memset(num , 0 , sizeof(num));
        memset(dp , 0 , sizeof(dp));
        int i , j , a , b;
        for(i = 1;i <= n;i++){
            scanf("%d%d",&a,&b);
            if(a+b < n && num[a][b] < (n - a - b)) num[a][b]++;
        }
        for(i = 1;i <= n;i++)//对于第i个人
            for(j = 0;j < i;j++)//他可能表述为前面有j个人,j在[0 i-1],所以是dp[j] + num[j][]
            dp[i] = max(dp[i] , dp[j] + num[j][n-i]);//为什么num的二维表示成[n-i]?这样能够保证2个for下来遍历全部该遍历的num[i][j]!!!
        cout << dp[n] << endl;
    }
    return 0;
}


HDU 4293 Groups (线性dp),布布扣,bubuko.com

HDU 4293 Groups (线性dp)

标签:style   blog   http   color   strong   2014   

原文地址:http://www.cnblogs.com/yxwkf/p/3831892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!