• NYOJ 737 石子合并(一)


    题意

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

    解法

    • 区间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];
    }
    
  • 相关阅读:
    io
    文件
    诚实
    没有犯错并不代表自己就是做得好
    脑力锻炼的随缘
    电路运算
    “容错率”
    GPU简介
    名与责任
    失眠和精神的思考
  • 原文地址:https://www.cnblogs.com/fridayfang/p/9495431.html
Copyright © 2020-2023  润新知