码迷,mamicode.com
首页 > 其他好文 > 详细

NYOJ 737 石子合并(一)

时间:2018-08-17 22:20:19      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:表示   代码   i+1   题意   解法   turn   区间   区间dp   pre   

题意

  • 排成一排的石子,每次合并相邻两堆并由一定的代价,求合并成一堆的最小代价

    解法

  • 区间dp 枚举长度
  • dp[i,j]表示合并石子堆编号从i到j为一堆所需的最小代价(这个题目的代价是sum(i..j))
  • dp[i,j]=min(dp[i,k]+dp[k+1,j]+sum(i...j))

    代码

int solve(){
    //dp[i][i]=0
    //dp[i][i+1]=sum[i+1]-sum[i-1]
    for(int i=1;i<=N;i++){
        dp[i][i]=0;
    }
    for(int i=1;i<N;i++){
        dp[i][i+1]=sum[i+1]-sum[i-1];//sum[0]=0;
    }
    for(int len=2;len<N;len++){
        for(int i=1;i<=N-len;i++){
            dp[i][i+len]=inf;
            for(int k=i;k<=i+len-1;k++)
            dp[i][i+len]=std::min(dp[i][i+len],dp[i][k]+dp[k+1][i+len]+sum[i+len]-sum[i-1]);
        }
    }
    return dp[1][N];
}

NYOJ 737 石子合并(一)

标签:表示   代码   i+1   题意   解法   turn   区间   区间dp   pre   

原文地址:https://www.cnblogs.com/fridayfang/p/9495431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!