UVA 10003 Cutting Sticks

来源:互联网 发布:拓普康es52传输软件 编辑:程序博客网 时间:2024/06/05 16:24

题目描述:

点击打开链接

非常典型的区间DP,枚举区间长度i,枚举起点j然后确定终点r,之后枚举区间分割点k来更新状态,dp[j][r]=min(dp[j][r],dp[j][k]+dp[k][r]+x),x为此时分割的长度。

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<stack>#include<queue>#include<algorithm>using namespace std;const int MAXM=110;const int INF=999999;int dp[MAXM][MAXM];int len;int a[MAXM];int n;int main(){    while(scanf("%d",&len)!=EOF)    {        if (len==0) break;        scanf("%d",&n);        a[0]=0;        for (int i=1;i<=n;i++)            scanf("%d",&a[i]);        a[n+1]=len;        memset(dp,INF,sizeof(dp));        for (int i=1;i<=n+1;i++)        {            for (int j=0;j+i<=n+1;j++)            {                int r=i+j;                if (i==1) dp[j][r]=0;                for (int k=j+1;k<r;k++)                    dp[j][r]=min(dp[j][r],dp[j][k]+dp[k][r]+a[r]-a[j]);            }        }        printf("The minimum cutting is %d.\n",dp[0][n+1]);    }    return 0;}


原创粉丝点击