uva 10003 lrj-P278 区间dp入门

来源:互联网 发布:单身约会软件 编辑:程序博客网 时间:2024/06/05 18:10

题意:

给出一根棍子的长度,以及n个需要切割的点,每一次切割的代价是这一段需要被切割的长度

问代价最小时的代价值

题解:

区间dp

dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[j]-a[i]);
 i 为区间左端点,j 为右端点,k为中间的子问题

dp表示某一个区间的最小切割值

区间dp 的思路,先枚举区间大小,然后枚举区间的起始位置,此时就能知道区间的终止位置

然后枚举中间点,从子问题得到区间 i  到 j 的解

最后就能得到答案


#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int a[100],dp[100][100];int main(){    int l,n;    //freopen("in.txt","r",stdin);    while(scanf("%d",&l),l)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        a[0]=0,a[n+1]=l;        memset(dp,0x3f3f3f3f,sizeof(dp));        for(int i=1;i<=n;i++)            dp[i-1][i]=0;        dp[n][n+1]=0;        for(int len=2;len<=n+1;len++)            for(int i=0,j=i+len;i+len<=n+1;i++,j=i+len)                for(int k=i+1;k<j;k++)                    dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[j]-a[i]);        printf("The minimum cutting is %d.\n",dp[0][n+1]);    }    return 0;}


原创粉丝点击