您的位置:首页 > 其它

SRM 578 div1

2012-10-21 21:01 435 查看
第一次做DIV1,果断爆0。。。弱B的孩子伤不起啊。。。

275pt那题调了一上午没调出来,明显的傻逼dp就是不会写。。。T_T

参考DD大神的思路:

dp[i][j]表示从第i个位置贴一个长度为L的stamp,颜色为j。。。。

View Code

class Stamp {
public:
int dp
[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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: