[ 区间dp ],UVA10003

题目

有一根长度为L的木棍,还有n个切割点的位置(按照从小到大排列)。你的任务是在这些切割点的位置处把木棍切成n+1部分,使得总切割费用最小。每次切割的费用等于被切割木棍的长度。
例如,L = 10,切割点为2,4,7。如果按照2,4,7的顺序排序,费用为10+8+6=24,如果按照4,2,7的顺序,费用为10+4+6=20


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define INT 0x3f3f3f3f
using namespace std;
int ans=INT;
int f[900][900],q[900],sum[900];
int m,n;
int dfs(int i,int j)
{
    if(f[i][j]!=-1)return f[i][j];
    if(j-i==1)return 0;
         f[i][j]=INT;
        for(int k=i;k<=j;k++)
        //?????????????????????
        f[i][j]=min(f[i][j],dfs(i,k)+dfs(k,j)+q[j]-q[i]);
    return f[i][j];
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(f,-1,sizeof(f));
    for(int i=1;i<=m;i++)scanf("%d",&q[i]);
    sort(q+1,q+1+m);q[m+1]=n;q[0]=0;
    //?????
    int ans=dfs(0,m+1);
    cout<<ans<<endl;
}

猜你喜欢

转载自blog.csdn.net/k42946/article/details/81117846