SRM 578 div1
第一次做DIV1,果断爆0。。。弱B的孩子伤不起啊。。。
275pt那题调了一上午没调出来,明显的傻逼dp就是不会写。。。T_T
参考DD大神的思路:
dp[i][j]表示从第i个位置贴一个长度为L的stamp,颜色为j。。。。
View Code
class Stamp { public: int dp[N][4]; int cc(char c) { if(c == 'R') return 0; if(c == 'G') return 1; if(c == 'B') return 2; return 3; } int getMinimumCost(string dc, int sc, int pc) { int n = dc.size(), i, j, nj, k, l, t; LL ans = inf; for(l = 1; l <= n; ++l) { for(i = 0; i < N; ++i) for(j = 0; j < 3; ++j) dp[i][j] = inf; for(j = 0; j < 3; ++j) { t = cc(dc[0]); if(t == 3 || t == j) dp[0][j] = 1; } for(i = 0; i < n; ++i) { for(j = 0; j < 3; ++j) { for(k = i + 1; k <= i + l && k < n; ++k) { if(k + l - 1 >= n) break; t = cc(dc[k-1]); if(t != 3 && t != j) break; for(nj = 0; nj < 3; ++nj) { if(k < i + l && nj != j) continue; t = cc(dc[k]); if(t != 3 && t != nj) continue; dp[k][nj] = min(dp[k][nj], dp[i][j] + 1); } } } } /* for(i = 0; i < n; ++i) { printf("%d | %d %d %d\n", i, dp[i][0], dp[i][1], dp[i][2]); } printf("-------------%d-------------\n", l); */ for(j = 0; j < 3; ++j) { bool f = true; for(i = n - l; i < n; ++i) { t = cc(dc[i]); if(t != 3 && t != j) f = false; } if(f) ans = Min(ans, LL(dp[n - l][j])*LL(pc) + LL(l*sc)); } } return ans; } };