P5322

状态表示

\[dp[i]表示主人公出动i名士兵获得的分数 \]

转移

  • 将输入数组进行排序,使得 \(in[i][j]\) 表示对于第 \(i\) 座城堡,出动兵力第 \(j\) 小的玩家的士兵数

  • 这样做,如果主人公能在 \(i\) 城堡打败第 \(j\) 个人,将获得 \(i \times j\)

\[dp[j]=max(dp[j-in[i][k]*2-1]+i*k,dp[j]) \]

  • 因为要严格大于对方的两倍,所以要 \(j-in[i][k]*2-1\)

  • 求最大值时要枚举每一个出兵数

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF=1e9;
const int N=110;

int s,n,m;
int in[110][110],dp[20010],maxi;

signed main(){
//	freopen("1.in","r",stdin);
	cin>>s>>n>>m;
	for(int i=1;i<=s;i++){
		for(int j=1;j<=n;j++)
			cin>>in[j][i];
	}
	for(int i=1;i<=n;i++)
		sort(in[i]+1,in[i]+1+s);
	for(int i=1;i<=n;i++){
		for(int j=m;j>=0;j--){
			for(int k=1;k<=s;k++)
				if(j>=in[i][k]*2+1) dp[j]=max(dp[j-in[i][k]*2-1]+i*k,dp[j]);
		}
	}
	for(int i=0;i<=m;i++)
		maxi=max(maxi,dp[i]);
	cout<<maxi<<"\n";
}
posted on 2023-06-08 10:23  Bubble_e  阅读(32)  评论(0)    收藏  举报