您的位置:首页 > 其它

UVA 10003 - Cutting Sticks

2014-08-05 14:29 417 查看
这个题 真是让我调了n遍啊

思路很简单。 在一个 0---n+1 的棍子上, 有 n个节点, 要想获得最小的费用, 在切一下的时候 费用一定是 a【j】 - a【i】

所以现在 只需要 剩下的 0- i 和 j 到 n+1 这两段 的费用最小, 继续按照上面的思路走, 继续切。 所以就要求每一部分都要小而已。

最后一次遍历 两个端点 0 -- n+1 试一试每一个节点,找出最小值即可。

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define ll long long
#define maxn 1000+10
#define INF 1<<30
int dp[maxn][maxn]={0};
int main (){
    int len;
    while(scanf("%d",&len) && len){
        int l[maxn] = {0};
        int n;
        memset(dp,0,sizeof(dp));
        scanf("%d",&n);
        for(int i = 1; i <= n; i++)
            scanf("%d",&l[i]);
        l[n+1] = len;
        for(int j= 2; j <= n+1; j++){
            for(int i = j-1; i >= 0; i--){
                int z = INF;
                for(int k = i+1 ; k < j ; k++){
                    z = min(dp[i][k] + dp[k][j] , z) + l[j] - l[i];
                    if(z != INF && dp[i][j] == 0)
                        dp[i][j] = z;
                    else if(z != INF && dp[i][j] != 0)
                        dp[i][j] = min(dp[i][j] , z);
                }
            }
        }
        printf("The minimum cutting is %d.\n",dp[0][n+1]);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: