zoukankan      html  css  js  c++  java
  • 合并石子(区间dp)

    {
    
        int p,j,i,k,n;
    
        scanf("%d",&n);
    
        for(i=1;i<=n;i++)
         {
            int x;
            scanf("%d",&x);
            s[i]+=s[i-1]+x;//前缀和
         }
    
        memset(f,127,sizeof(f));//找最小值,自然要赋初值为最大的啦
    
        for(i=1;i<=n;i++)
         f[i][i]=0;//初始化
    
        for(p=1;p<=n;p++)//合并i后面的堆数p: 阶段
         for(i=1;i<=n-p;i++)//枚举状态
          {
            int j=i+p;//i是起点,p为区间长度,j自然是区间终点了
    
            for(k=i;k<=j-1;k++)//枚举决策
             f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);//状态转移方程
    
          }
    
         printf("%d",f[1][n]);
    
         return 0;
    } 

    DO YOU LIKE MI FOR I ?
    1、前缀和的应用。
    2、区间的dp的求解方法:
    不能顺推也不能倒推。
    是以区间长度的大小划分阶段。
    按区间从小到大的顺序划分。

  • 相关阅读:
    模块 hashlib模块
    设计模式
    类中双下方法
    工作小结 常见定制类
    python collections模块
    启动脚本
    anaconda镜像
    理解python的可变参数
    使用spark
    python 异常处理
  • 原文地址:https://www.cnblogs.com/ht008/p/6819858.html
Copyright © 2011-2022 走看看