zoukankan      html  css  js  c++  java
  • HDU 4293 Groups (线性dp)

    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;
    }


  • 相关阅读:
    多线程常见面试题
    Redis常见面试题总结
    ehcache缓存技术的特性
    sar 命令详解
    面试题
    BOOTPROTO=[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)
    课后习题-10
    ulimit 命令详解
    课后习题-9
    netstat 命令详解
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3831892.html
Copyright © 2011-2022 走看看