10.16 动态规划(一)

区间DP

P1220  关路灯

代码:

```cpp
#include <cstdio>
#include <cstring>

#define min(a,b) ((a)<(b)?(a):(b))

typedef long long ll;
const int N = 55;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
ll f[N][N][2];
int P[N], L[N], n, c, pre[N];

int main(){
    scanf("%d%d", &n, &c);
    for(int i = 1; i <= n; ++i){
        scanf("%d%d", L+i, P+i);
        pre[i] = pre[i-1] + P[i];
    }
    
    for(int l = 1; l <= n; ++l){
        for(int i = 1, j; (j = i + l - 1) <= n; ++i){
            if(i <= c && c <= j){
                f[i][j][0] =
                    min(
                        f[i+1][j][0] + (L[i+1] - L[i]) * (pre[n] - pre[j] + pre[i]), 
                        f[i+1][j][1] + (L[j] - L[i]) * (pre[n] - pre[j] + pre[i])
                    );
                f[i][j][1] =
                    min(
                        f[i][j-1][0] + (L[j] - L[i]) * (pre[n] - pre[j-1] + pre[i-1]), 
                        f[i][j-1][1] + (L[j] - L[j-1]) * (pre[n] - pre[j-1] + pre[i-1])
                    );
            }else{
                f[i][j][0] = f[i][j][1] = INF;
            }
        }
    }
    
    printf("%lld\n", min(f[1][n][0], f[1][n][1]));
    
    return 0;
}
```
View Code

CQOI2007  涂颜色

P3205  合唱队

SCOI2003

#include <cstdio>
#include <cstring>

const int N = 105, INF = 0x3f3f3f3f;
int f[N][N];
char s[N];
int n;
int nl[N];

void chkmn(int &a, int b) {
    if (a > b) a = b;
}

bool check(char s[], int n, int len) {
    for (int i = len; i < n; ++i) {
        if (s[i] != s[i % len]) return false;
    }
    return true;
}

int main() {
    scanf("%s", s);
    n = strlen(s);

    for (int i = 1; i <= 9; ++i)
        nl[i] = 1;
    for (int i = 10; i <= 99; ++i)
        nl[i] = 2;
    nl[100] = 3;

    memset(f, 0x3f, sizeof(f));
    for (int i = 0; i < n; ++i) {
        f[i][i] = 1;
    }

    for (int l = 2; l <= n; ++l) {
        for (int i = 0, j; (j = i + l - 1) < n; ++i) {
            for (int k = i; k < j; ++k) {
                chkmn(f[i][j], f[i][k] + f[k + 1][j]);
            }

            for (int k = i; k < j; ++k) {
                int len = k - i + 1;
                if (l % len != 0) continue;
                if (check(s + i, l, len)) {
                    chkmn(f[i][j], f[i][k] + 2 + nl[l / len]);
                }
            }
        }
    }

    printf("%d\n", f[0][n - 1]);
}

状态压缩DP

SCOI2005 互不侵犯

猜你喜欢

转载自www.cnblogs.com/zyddd915/p/11684903.html
今日推荐