区间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 CodeCQOI2007 涂颜色
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 互不侵犯