intさわだんのBlack History

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

第10回日本情報オリンピック 本選 「古本屋」  AOJ0561 (Books)

DP

dp[i][j]:=ジャンルiまでの本をj冊売るときの買い取り価格の最大値.

各ジャンルについてソートしてi冊売ったときの値段を記録しておきます。

#include <bits/stdc++.h>

using namespace std;

int n,dp[2003][2003],b[11][2003],k,co[11];
int main(){
	scanf("%d%d",&n,&k);
	for(int i = 1;i <= 10;i++)co[i]=1,b[i][0] = 100000000;
	for(int i = 0;i < n;i++){
		int a1,a2;
		scanf("%d%d",&a1,&a2);
		b[a2][co[a2]] = a1;
		co[a2]++;
	}
	for(int i = 1;i <= 10;i++)sort(b[i],b[i] + co[i],greater<int>());
	for(int i = 1;i <= 10;i++){ 
		b[i][0] = 0;
		for(int j = 1;j < co[i];j++){
			b[i][j] += b[i][j-1] + (j-1)*2;
		}
	}
	for(int i = 1;i <= 10;i++){
		for(int j = 1;j <= k;j++){
			for(int l = 0;l <= min(co[i]-1,j);l++){
				dp[i][j] = max(dp[i][j],dp[i-1][j-l]+b[i][l]);
			}
		}
	}
	printf("%d\n",dp[10][k]);
	return 0;
}