https://www.hackerrank.com/contests/kodamanwithothers/challenges/lets-shoot
解説
dpで解けそう。 添字も小さいし、こんなDPで解けるんじゃない? dp[i][mizu][hi][kusa] := i番目の生徒まで終わっていて、トレーニング済みの水属性がmizu人、火属性がhi人、草属性がkusa人のときのコスト最小値 804なので、大丈夫そう。 根性DP。
int N, K, T[80], C[80]; int dp[81][82][82][82]; //--------------------------------------------------------------------------------------------------- void _main() { cin >> N >> K; rep(i, 0, N) cin >> T[i] >> C[i]; rep(i, 0, N + 1) rep(mizu, 0, N + 1) rep(hi, 0, N + 1) rep(kusa, 0, N + 1) dp[i][mizu][hi][kusa] = inf; dp[0][0][0][0] = 0; rep(i, 0, N) rep(mizu, 0, N + 1) rep(hi, 0, N + 1) rep(kusa, 0, N + 1) if(dp[i][mizu][hi][kusa] < inf) { chmin(dp[i + 1][mizu][hi][kusa], dp[i][mizu][hi][kusa]); if (T[i] == 1) { // mizu chmin(dp[i + 1][mizu + 1][hi][kusa], dp[i][mizu][hi][kusa] + C[i]); } else if (T[i] == 2) { // hi if (mizu < hi + 1) continue; chmin(dp[i + 1][mizu][hi + 1][kusa], dp[i][mizu][hi][kusa] + C[i]); } else { // kusa if (hi < kusa + 1) continue; chmin(dp[i + 1][mizu][hi][kusa + 1], dp[i][mizu][hi][kusa] + C[i]); } } int ans = inf; rep(mizu, 0, N + 1) rep(hi, 0, N + 1) rep(kusa, 0, N + 1) if(mizu + hi + kusa == K) chmin(ans, dp[N][mizu][hi][kusa]); if (ans != inf) cout << ans << endl; else cout << "Let's Shoot!" << endl; }