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;
    }
};
posted @ 2012-10-21 21:01  AC_Von  阅读(254)  评论(0编辑  收藏  举报