习题:排兵布阵(DP)

题目

传送门

思路

背包板子题

代码

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int s,n,m;
int maxx;
vector<int> v[105];
int dp[105][20005];//前i个城堡总共用了j的兵力,最终能收获的最大成果
int main()
{
	cin>>s>>n>>m;
	for(int i=1;i<=s;i++)
		for(int j=1;j<=n;j++)
		{
			int x;
			cin>>x;
			v[j].push_back(x);
		}
	for(int i=1;i<=n;i++)
		sort(v[i].begin(),v[i].end());
	for(int i=1;i<=n;i++)//前i个城堡
	{
		for(int j=1;j<=m;j++)//用了j的兵力
		{
			dp[i][j]=dp[i-1][j]; 
			for(int k=0;k<v[i].size();k++)//对于每一个人
			{
				if(j>v[i][k]*2)
					dp[i][j]=max(dp[i][j],dp[i-1][j-v[i][k]*2-1]+i*(k+1));
				else
					break;
			}
		}
	}
	for(int i=1;i<=m;i++)
		maxx=max(maxx,dp[n][i]);
	cout<<maxx;
	return 0;
}
posted @ 2019-12-28 14:45  loney_s  阅读(263)  评论(0)    收藏  举报