切木棍(区间模型动态规划)

题目链接

https://vjudge.net/problem/UVA-10003 

d[i][j]表示在i到j这一段上切一刀的最小权和,如果没有切过就为0。

状态转移方程为ans(i,j)=min{ans(i,k)+ans(k)(j) | i<k<j } +d[j]-d[i] 

#include<bits/stdc++.h>
#include<algorithm>
#define max 0x3f3f3f3f
using namespace std;

int d[55];
int ans[55][55];

int main(){
    int distance;
    int length,j;
    while(scanf("%d",&distance)){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&d[i]);
        
    d[0]=0,d[n+1]=distance;
        
    for(length=1;length-1<=n+1;length++)
    for( int i=0;i+length-1<=n+1;i++){
         j=i+length-1;
        ans[i][j]=0;
        int minv=max;
        for(int k=i+1;k<j;k++){
            int temp=ans[i][k]+ans[k][j]+d[j]-d[i];
            if(minv>temp)
            minv=temp;
        }
        if(minv!=max)
        ans[i][j]=minv;
    
    }    
    
    printf("The minimum cutting is %d.\n", ans[0][n+1] );    
}
        
}

发布了57 篇原创文章 · 获赞 58 · 访问量 654

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/103545872