nyoj+区间dp石子合并

来源:互联网 发布:平面设计排版软件 编辑:程序博客网 时间:2024/04/30 10:01
点击打开链接
#include<stdio.h>#include<stdlib.h>#include<iostream>#include<cstring>#include<string>#include<string.h>#include<algorithm>#include<cmath>#define inf 0x3f3f3f3fusing namespace std;int dp[205][205],sum[205],a[205];int main(){    int n=0,i=0,j=0,k=0,len=0;    while(scanf("%d",&n)!=EOF){        memset(dp,0,sizeof(dp));        memset(sum,0,sizeof(sum));        for(i=1;i<=n;i++){            scanf("%d",&a[i]);            sum[i]=sum[i-1]+a[i];        }        for(len=1;len<=n;len++){///枚举区间长度。            for(i=1;i<=n-len;i++){///找出所有的区间长度len,i为区间len的左边坐标,j为区间len的右坐标。                j=i+len;                dp[i][j]=inf;///还没有进行dp,初始化。                for(k=i;k<j;k++){///k要从i开始(i=1,j=i+len-1)还未dp,区间一分为二进行枚举                    dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);///dp[i][k]+dp[k+1][j]为找出最小的,而sum[j]-sum[i]为两堆石子合并后要加的花费                }            }        }        printf("%d\n",dp[1][n]);    }    return 0;

0 0
原创粉丝点击