区间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; } ```
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 互不侵犯