http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1646
很水的dp,注意第一个牌是对后面的轮数才有效,然后法力值增加的是现在的总共的第一张牌数目,如果2牌并存的那话肯定是先加第一张牌,所以不需要减的情况有两种,1种是有第一种类型的牌,一种是没有打出第二种牌!
#include<bits/stdc++.h>
using namespace std;
int dp[25][210][210];int r,n,m;
int main(){
int t;cin>>t;
while(t--){
memset(dp,-1,sizeof(dp));
scanf("%d%d%d",&r,&n,&m);
dp[1][0][0]=0;
for(int k=1;k<r;k++){
int cnt=(k+1<10)?k+1:10;
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
if(dp[k][i][j]==-1) continue;
for(int x=0;x<=cnt/3;x++){
if(x+i<=n){
for(int y=0;y<=cnt/2;y++){
if(3*x+2*y<=cnt&&j+y<=m){
dp[k+1][i+x][j+y]=max(dp[k+1][i+x][j+y],dp[k][i][j]+i+(i+x)*y+4*y-(x||!y?0:2));
}
}
}
}
}
}
}
int maxx=0;
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
maxx=max(maxx,dp[r][i][j]);
}
}
printf("%d\n",maxx);
}
}