Quiz
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0561
AC code
http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=4146908#1
要素
解法
- 各ジャンルごとに高い順にソートしてよい
- そしてDP
// ジャンル i までで
// 合計 j 冊売るときの最大価格
ll dp[10][2010];
その他
- 非公式難易度は7
- ジャンル(種類)を添え字としたDP, 新鮮だった
- 公式解説用意してほしい
Code (抜粋)
ll dp[10][2010];
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
ll N,K;
cin >> N >> K;
VV A(10);
rep(i, N){
ll p,g;cin>>p>>g;
g--;
A[g].push_back(p);
}
rep(i, 10){
RSORT(A[i]);
}
AccSum Acc[10];
rep(i, 10){
Acc[i] = AccSum(A[i]);
}
rep(i, 10){
dp[i][0] = 0;
}
FOR(sell, 1, SZ(A[0])+1){
ll bonus = sell * (sell-1);
dp[0][sell] = Acc[0].sum(0, sell-1) + bonus;
}
FOR(g, 1, 10){
FOR(sum, 1, K+1){
dp[g][sum] = dp[g-1][sum];
FOR(a, 1, SZ(A[g])+1){
ll bonus = a * (a-1);
ll price_sum = Acc[g].sum(0, a-1);
if(sum-a<0) break;
chmax(dp[g][sum], dp[g-1][sum-a] + bonus + price_sum);
}
}
}
ll ans = dp[9][K];
p(ans);
return 0;
}