题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1325
这道题我一开始不会做,然后看题解也不会,差不多一周后,今天一看懂了
这是一颗树,一个节点有三个子节点,然后要求出根节点的最大值
从叶子节点开始回溯,根节点的值就出来了
然后比较一下就可以得到答案
#include <map>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=10005;
int dp[maxn][200],a[maxn],sum[maxn];
int main()
{
int t;
scanf("%d",&t);
string str;
string pk[14]={"","A","2","3","4","5","6","7","8","9","10","J","Q","K"};
for(int k=1;k<=t;k++)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>str;
for(int j=1;j<=13;j++)
{
if(str==pk[j])
{
a[i]=j;
}
}
}
sum[n+1]=0;
for(int i=n;i>=1;i--)
{
sum[i]=sum[i+1]+a[i];
}
memset(dp,0,sizeof(dp));
for(int i=n;i>=1;i--)
{
for(int j=1;j<150;j++)
{
dp[i][j]=sum[i]-max(dp[i+j][j],max(dp[i+j][j-1],dp[i+j][j+1]));
}
}
if(2*dp[1][1]>sum[1])
printf("Case #%d: Song\n",k);
if(2*dp[1][1]==sum[1])
printf("Case #%d: Again\n",k);
if(2*dp[1][1]<sum[1])
printf("Case #%d: Takeout\n",k);
}
return 0;
}