intさわだんのBlack History

刹那的レジェンドになりたい。

第13回日本情報オリンピック 本選 「IOI饅頭」  AOJ0599 (IOI Manju)

DP

解説は下を参照してください。
http://www.ioi-jp.org/joi/2013/2014-ho/2014-ho-t2-review.pdf

#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
int m,n,ans;
int ma[10003];
int ha[503][2];
int dp[503][10003];
int main(){
	scanf("%d%d",&m,&n);
	for(int i = 0;i < m;i++){
		scanf("%d",&ma[i]);
	}
	sort(ma,ma + m,greater<int>());
	for(int i = 1;i < m;i++)ma[i] += ma[i-1];
	for(int i = 0;i < n;i++){
		scanf("%d%d",&ha[i][0],&ha[i][1]);
	}
	for(int i = 0;i <= n;i++){
		for(int j = 1;j <= m;j++){
			dp[i][j] = INF;
		}
	}
	for(int i = 1;i <= ha[0][0];i++){
		dp[1][i] = ha[0][1];
		ans = max(ans,ma[i-1]-dp[1][i]);
	}
	for(int i = 2;i <= n;i++){
		for(int j = 1;j <= m;j++){
			dp[i][j] = min(dp[i-1][j],ha[i-1][1]+dp[i-1][max(0,j-ha[i-1][0])]);
			ans = max(ans,ma[j-1]-dp[i][j]);
		}
	}
	printf("%d\n",ans);
	return 0;
}