Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
贴一个不一样的解法,状态转移方程含义不同.// f[i][j] : i:有i个post, j处结束并且j处有一个post // f[i][j] = min { f[i][k] + cost[k][j] } // 最后的解应该是 min { cost[k][n+1] + f[m][k] }(k>=m) // cost[i][j]: i处有一个post, j有一个post // 数据有点水 #include <stdio.h> #include <stdlib.h> #include <math.h> #define V (305) #define P (35) #define MAX (200000) int a[V]; int f[P][V]; int cost[V][V]; void sum(int pre, int cur) { int s = 0; int i = 0; for (i = pre+1; i < cur; ++i) { if (a[i]-a[pre] < a[cur]-a[i]) { s += a[i]-a[pre]; } else { s += a[cur]-a[i]; } } cost[pre][cur] = s; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif int n = 0; int m = 0; while (EOF != scanf("%d %d", &n, &m)) { int i = 0; int j = 0; for (i = 1; i <= n; ++i) { scanf("%d", &a[i]); } a[0] = -MAX; a[n+1] = MAX; for (i = 0; i <= n; ++i) { for (j = i+1; j <= n+1; ++j) { sum(i, j); } } if (1 == m) { int mid = (1+n)/2; printf("%d\n", cost[0][mid]+cost[mid][n+1]); } else { for (i = 1; i <= n; ++i) { f[1][i] = cost[0][i]; } for (i = 2; i <= m; ++i) { for (j = i; j <= n; ++j) { int k = 0; int min = MAX; for (k = 1; k < j; ++k) { int t = f[i-1][k]+cost[k][j]; if (min > t) { min = t; } } f[i][j] = min; } } int min = MAX; for (i = m; i <= n; ++i) { if (min > f[m][i]+cost[i][n+1]) { min = f[m][i]+cost[i][n+1]; } } printf("%d\n", min); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator