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

区间dp板子

时间:2024-10-11 21:14:22浏览次数:13  
标签: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

相关文章

  • 【刷题笔记】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_......
  • 基于Window网络编程课程设计(刘琰著)写tcp和udp双回射服务器思想及代码实现
    再写一遍双回射,主要还是按照书上走,也方便自己回顾理解而且这个代码完美解决了tcp阻塞问题,其实看懂这个代码也理解了为什么上篇的代码网络编程——实现tcp和udp的双回射服务器(c++)-CSDN博客会被阻塞,读者可以自己思考下本书还是采用的是select的方法来实现双回射的服务器。一......
  • 洛谷P2224产品加工(DP)
    [HNOI2001]产品加工题目描述某加工厂有A、B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同。某一天,加工厂接到\(n\)个......
  • 树形DP问题归纳总结
    树形dp一般的状态定义方式:f[u][j]:所有只在以u为根的子树中选,且总体积不超过j的选法的集合题目1:树的最长路径最长路径也就相当于树的最大直径给定一棵树,树中包含n个结点(编号1~n)和n−1条无向边,每条边都有一个权值。现在请你找到树中的一条最长路径。换句话说,要找到一......