zoukankan      html  css  js  c++  java
  • 【codevs1048】石子归并(初级版)

    采用动态规划的原因:合并有一定次序,即:只能相邻石子进行合并。

    阶段:当前合并了的区间长度
    状态:区间的左右端点
    状态转移方程:(dp[l][r]=min{dp[l][r],dp[l][k]+dp[k+1][r]},kin[l,r))

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=310;
    
    int n,sum[maxn],dp[maxn][maxn];
    
    void read_and_parse(){
        scanf("%d",&n);
        memset(dp,0x3f,sizeof(dp));
        for(int i=1;i<=n;i++){
            scanf("%d",&sum[i]);
            sum[i]+=sum[i-1];
            dp[i][i]=0;
        }
    }
    
    void solve(){
        for(int len=2;len<=n;len++)
            for(int l=1;l<=n-len+1;l++){
                int r=l+len-1;
                for(int k=l;k<r;k++)
                    dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
                dp[l][r]+=sum[r]-sum[l-1];
            }
        printf("%d
    ",dp[1][n]);
    }
    
    int main(){
        read_and_parse();
        solve();
        return 0;
    }
    
  • 相关阅读:
    140704
    140703
    140702
    堆排序
    并查集
    140701
    这年暑假集训-140630
    vim for python
    hihocode 第九十二周 数论一·Miller-Rabin质数测试
    hdu 3157 Crazy Circuits 有源汇和下界的最小费用流
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/9816124.html
Copyright © 2011-2022 走看看