zoukankan      html  css  js  c++  java
  • [nyoj737]石子归并(区间dp入门题)

    题意:有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。

    解题关键:区间dp,首先枚举区间,再枚举分割点,区间由小到大更新。

    转移方程:$dp[l][r] = min (dp[l][r],dp[l][i + 1] + dp[i + 1][r] + w[i][j])$

    复杂度:$O({n^3})$

    注意$dp[i][i] = 0$

    转载的比较好的一段理解:http://blog.csdn.net/xuanandting/article/details/47171693

    区间动态规划问题一般都是考虑,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合 ,求合并后的最优值。
    设F[i,j](1<=i<=j<=n)表示区间[i,j]内的数字相加的最小代价
    最小区间F[i,i]=0(一个数字无法合并,∴代价为0)

    每次用变量k(i<=k<=j-1)将区间分为[i,k]和[k+1,j]两段
    For l:=1 to n do // l是区间长度,作为阶段。 
    for i:=1 to n do // i是穷举的区间的起点
    begin
    j:=i+l-1; // j是 区间的终点,这样所有的区间就穷举完毕
    if j>n then break; // 这个if很关键。
    for k:= i to j-1 do // 状态转移,去推出 f[i,j]
    f[i , j]= max{f[ i,k]+ f[k+1,j]+ w[i,j] } 
    end; 
    这个结构必须记好,这是区间动态规划的代码结构。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int maxn=302;
     5 int a[maxn],sum[maxn];
     6 int dp[maxn][maxn];
     7 int main(){
     8     int n;
     9     ios::sync_with_stdio(0); 
    10     while(cin>>n){
    11         memset(dp,0,sizeof dp);
    12         for(int i=1;i<=n;i++) cin>>a[i],sum[i]=sum[i-1]+a[i];
    13         for(int len=2;len<=n;len++){//最外层是区间长度 
    14             for(int l=1,r;(r=l+len-1)<=n;l++){
    15                 dp[l][r]=0x3f3f3f3f;//切割位置为该点的右边 
    16                 for(int i=l;i<r;i++) dp[l][r]=min(dp[l][r],dp[l][i]+dp[i+1][r]+sum[r]-sum[l-1]);
    17             }
    18         }
    19         cout<<dp[1][n]<<"
    ";
    20     }
    21 }
  • 相关阅读:
    CodeForces Gym 100500A A. Poetry Challenge DFS
    CDOJ 486 Good Morning 傻逼题
    CDOJ 483 Data Structure Problem DFS
    CDOJ 482 Charitable Exchange bfs
    CDOJ 481 Apparent Magnitude 水题
    Codeforces Gym 100637G G. #TheDress 暴力
    Gym 100637F F. The Pool for Lucky Ones 暴力
    Codeforces Gym 100637B B. Lunch 找规律
    Codeforces Gym 100637A A. Nano alarm-clocks 前缀和
    TC SRM 663 div2 B AABB 逆推
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/7423740.html
Copyright © 2011-2022 走看看