首页 > 其他分享 >区间dp板子

区间dp板子

时间:2024-10-11 21:14:22浏览次数:10  
标签:int memset 板子 区间 tie sizeof dp

比较简单的dp,但是建模可能会比较困难。
以P1775 石子合并(弱化版)为例(https://www.luogu.com.cn/problem/P1775)

思路:
要求1-n的石子合并的代价,可以看成小的区间问题,化为1-k + k-n的两个区间。然后就有递推式子:
dp[i][j] = min(dp[i][j],dp[i][k] + dp[k+1][j] + w[j] - w[i-1]
编码:

memset(dp,0,sizeof(dp));
for(int len=2;len<=n;len++)
{
  for(int i=1;i<=n;i++)
  {
    int j=i+len-1;//j:终点,i:起点,len:长度
    if(j>n)break;
    for(int k=i;k<j;k++)
    {
      if(dp[i][j])dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+w[j]-w[i-1]);
      else dp[i][j]=dp[i][k]+dp[k+1][j]+w[j]-w[i-1];
    }
  }
}

ac代码:

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int N=310;
int m[N];
int n;
int dp[N][N];

int main()
{
    IOS;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>m[i],m[i]+=m[i-1];
    memset(dp,0,sizeof(dp));
    for(int len=2;len<=n;len++)
    {
        for(int i=1;i<=n;i++)
        {
            int j=i+len-1;
            if(j>n)break;
            for(int k=i;k<j;k++)
            {
                if(dp[i][j])dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+m[j]-m[i-1]);
                else dp[i][j]=dp[i][k]+dp[k+1][j]+m[j]-m[i-1];
            }
        }
    }
    cout<<dp[1][n];
    return 0;
}

标签:int,memset,板子,区间,tie,sizeof,dp
From: https://www.cnblogs.com/zzzsacmblog/p/18459342

相关文章

  • ABC292G Count Strictly Increasing Sequences [区间DP]
    Description你有\(n\)个数,每个数长度为\(m\)。不过这\(n\)个数中,可能有某些位不确定,需要你在每个?位置上\(0\)到\(9\)之间填一个数。设你填出来的序列是\(\{S_i\}\)。请你求出,在所有可能的填数方案中,有多少种满足\(S_1<S_2<\dots<S_n\)?对\(998244353\)取......
  • 【刷题笔记】DP 2021.10.11
    Candies思路朴素的算法设\(f_{i,j}\)表示给前\(i\)个小朋友分\(j\)个糖的方案数,\[f_{i,j}=\sum_{k=0}^{min(a[i],j)}f_{i-1,j-k}\]注意到此时时间复杂度为\(O(n\timesk^2)\)想到用前缀和进行优化,设\(s_{i,j}\)表示\(\sum_{j=0}^{k}f_{i,j}\)则\(DP\)转移方程\[f_{i,j}=s_......
  • LeetCode:871. 最低加油次数(DP Java)
    目录871.最低加油次数题目描述:实现代码与解析:DP原理思路:871.最低加油次数题目描述:        汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。沿途有加油站,用数组 stations 表示。其中 stations[i]=[positioni,fueli] 表示第 ......
  • webservice接口调用报:由于 ContractFilter 在 EndpointDispatcher 不匹配,因此 Action
    1、问题:<s:Envelopexmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Fault><faultcodexmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode><faul......
  • wordpress网站 建立数据库连接出错
    WordPress网站在建立数据库连接时出错通常是由以下几个原因造成的:配置文件错误:检查 wp-config.php 文件中的数据库配置信息是否正确,包括数据库主机名、用户名、密码、数据库名称等。数据库服务器未运行:确保MySQL或其他数据库服务正在运行,并且可以从Web服务器访问。数据......
  • 基于Window网络编程课程设计(刘琰著)写tcp和udp双回射服务器思想及代码实现
    再写一遍双回射,主要还是按照书上走,也方便自己回顾理解而且这个代码完美解决了tcp阻塞问题,其实看懂这个代码也理解了为什么上篇的代码网络编程——实现tcp和udp的双回射服务器(c++)-CSDN博客会被阻塞,读者可以自己思考下本书还是采用的是select的方法来实现双回射的服务器。一......
  • 洛谷P2224产品加工(DP)
    [HNOI2001]产品加工题目描述某加工厂有A、B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同。某一天,加工厂接到\(n\)个......
  • 【做题笔记】Atcoder 之 dp 专题训练
    ABCDEFGHI概率dp。设\(dp_{i,j}\)表示前\(i\)个硬币中有\(j\)个正面的概率。转移显然:\(dp_{i,j}=dp_{i-1,j-1}\timesp_i+dp_{i-1,j}\times(1-p_i)\)当\(j=0\)时,前\(i\)个硬币中没有正面。所以只能由反面的概率转移过来,转移为:\(dp_{i,j}=dp_{i-1,j}\time......
  • E62 树形DP P8677 [蓝桥杯 2018 国 A] 采油
    视频链接:  P8677[蓝桥杯2018国A]采油-洛谷|计算机科学教育新生态(luogu.com.cn)//树形DP+贪心O(nlogn)#include<bits/stdc++.h>#defineN100010usingnamespacestd;vector<int>e[N];intn,B[N],S[N],f[N],len;structman{intb,s;};boolcmp(manx,......
  • 树形DP问题归纳总结
    树形dp一般的状态定义方式:f[u][j]:所有只在以u为根的子树中选,且总体积不超过j的选法的集合题目1:树的最长路径最长路径也就相当于树的最大直径给定一棵树,树中包含n个结点(编号1~n)和n−1条无向边,每条边都有一个权值。现在请你找到树中的一条最长路径。换句话说,要找到一......