• HOJ 2091 Chess(三维简单DP)


    Chess
    My Tags (Edit)
    Source : Univ. of Alberta Local Contest 1999.10.16
    Time limit : 1 sec Memory limit : 32 M
    Submitted : 244, Accepted : 100
    The Association of Chess Monsters (ACM) is planning their annual team match up against the rest of the world. The match will be on 30 boards, with 15 players playing white and 15 players playing black. ACM has many players to choose from, and they try to pick the best team they can. The ability of each player for playing white is measured on a scale from 1 to 100 and the same for playing black. During the match a player can play white or black but not both. The value of a team is the total of players’ abilities to play white for players designated to play white and players’ abilities to play black for players designated to play black. ACM wants to pick up a team with the highest total value.
    Input
    Input consists of a sequence of lines giving players’ abilities. Each line gives the abilities of a single player by two integer numbers separated by a single space. The first number is the player’s ability to play white and the second is the player’s ability to play black. There will be no less than 30 and no more than 1000 lines on input.
    There are multiple test cases. Each case will be followed by a single line containing a “*”.
    Output
    Output a single line containing an integer number giving the value of the best chess team that ACM can assemble.
    Sample Input
    87 84
    66 78
    86 94
    93 87
    72 100
    78 63
    60 91
    77 64
    77 91
    87 73
    69 62
    80 68
    81 83
    74 63
    86 68
    53 80
    59 73
    68 70
    57 94
    93 62
    74 80
    70 72
    88 85
    75 99
    71 66
    77 64
    81 92
    74 57
    71 63
    82 97
    76 56
    *
    Sample Output
    2506

    如果能想到用三维表示状态,就很容易了
    dp[i][j][k]表示到第i个人已经选了j个人去打白选了k个人去打黑
    那么dp[i][j][k]只有三种情况,在第i个人要么不选他,要么选他打白,要么选他打黑

    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <algorithm>
    
    using namespace std;
    int dp[1005][20][20];
    int a[1005];
    int b[1005];
    char c[1005];
    char d[1005];
    int fun(char *a)
    {
        int len=strlen(a);
        int num=0;
        for(int i=0;i<len;i++)
        {
            num+=(a[i]-'0')*(int)(pow(10,(len-i-1)));
        }
        return num;
    
    }
    int main()
    {
        while(scanf("%s",c)!=EOF)
        {
            scanf("%s",d);
            int cnt=0;
            while(true)
            {
                a[++cnt]=fun(c);
                b[cnt]=fun(d);
                scanf("%s",c);
                if(c[0]=='*')
                    break;
                else
                    scanf("%s",d);
            }
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=cnt;i++)
            {
                for(int j=0;j<=15;j++)
                {
                    for(int k=0;k<=15;k++)
                    {
                        if(j+k>i)
                            continue;
                        if(!j&&k)
                            dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j][k-1]+b[i]);
                        else if(j&&!k)
                            dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-1][k]+a[i]);
                        else if(!j&&!k)
                            dp[i][j][k]=dp[i-1][j][k];
                        else
                            dp[i][j][k]=max(dp[i-1][j][k],max(dp[i-1][j-1][k]+a[i],dp[i-1][j][k-1]+b[i]));
                    }
                }
            }
            printf("%d
    ",dp[cnt][15][15]);
        }
        return 0;
    }
  • 相关阅读:
    世纪末的星期
    马虎的算式
    蜜蜂飞舞
    Torry 的困惑
    级数调和
    数列
    最大最小公倍数
    蚂蚁感冒
    12.integer to Roman
    13.Roman to Integer
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228797.html
Copyright © 2020-2023  润新知