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

╄→尐↘猪︶ㄣ 提交于 2019-12-16 10:20:05

 

题目链接

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] );    
}
        
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!