[FROM LUOGU]排兵佈陣

傳送門

SOL
乍一看你可能jio得這是一個貪心+模擬
如果是這樣的話,顯然你想多了
我們發現這應該是一個DP,再看看題目,存在兵力上限,那就相當於揹包容積咯,那就是分組揹包咯
可是也沒這麼輕易就讓你A了,直接轉移是不行的,我們可以貪心發現你打第ii個碉堡時如果想打爆最弱的jj個玩家,用2aj+12*aj+1個兵顯然是最優的,對原數組排一個序,就成爲了我們可以使用的物品

代碼:

#include<bits/stdc++.h>
using namespace std;
#define re register
inline char nc(){
    static char buf[10000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,10000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd(){
	int re data=0;char ch=0;ch=nc();
	while(!isdigit(ch))ch=nc();
	while(isdigit(ch))data=(data<<1)+(data<<3)+(ch^48),ch=nc();
	return data;
}
const int M=2e4+5,N=105;
int s,n,m,f[N][M],a[N][N];
signed main(){
	s=rd(),n=rd(),m=rd();
	for(int re i=1;i<=s;++i)
		for(int re j=1;j<=n;++j)
			a[j][i]=rd()<<1|1;
	for(int re i=1;i<=n;++i)sort(a[i]+1,a[i]+s+1);
	for(int re i=1;i<=n;++i){
		for(int re j=0;j<=s;++j)
			for(int re k=m;k>=a[i][j];--k)
				f[i][k]=max(f[i][k],f[i-1][k-a[i][j]]+j*i);		
	}
	cout<<f[n][m];
	exit(0);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章