前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HOJ 2091 Chess(三维简单DP)

HOJ 2091 Chess(三维简单DP)

作者头像
ShenduCC
发布2018-04-26 11:23:00
6570
发布2018-04-26 11:23:00
举报
文章被收录于专栏:算法修养算法修养

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个人要么不选他,要么选他打白,要么选他打黑

代码语言:javascript
复制
#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\n",dp[cnt][15][15]);
    }
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-02-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档