首页 > 其他分享 >动态规划区间DP

动态规划区间DP

时间:2024-04-02 21:58:51浏览次数:14  
标签:min int cin len long 区间 动态 DP

动态规划区间DP

普通区间DP

在这里插入图片描述

石子合并(蓝桥官网1233)

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=300;
int n,a[N],s[N],f[N][N];
signed main(){
    cin>>n;
    memset(f,127,sizeof(f));//初始化f为较大值
    for(int i=1;i<=n;i++){
      cin>>a[i];
      f[i][i]=0;//长度为1的区间不用合并,代价0
      s[i]=s[i-1]+a[i];//前缀和sum(i,j)
    }
    for(int len=2;len<=n;len++)
      for(int i=1;i+len-1<=n;i++){
        int j=i+len-1;
        for(int k=i;k<j;k++){
          f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
        }
      }
    cout<<f[1][n];
}

涂色(蓝桥官网926)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=60;
int f[N][N];
signed main(){
    string s;cin>>s;
    int n=s.size();
    memset(f,127,sizeof(f));
    for(int i=0;i<n;i++)f[i][i]=1;

    for(int len=2;len<=n;len++)
      for(int i=0;i+len-1<n;i++){
        int j=i+len-1;
        if(s[i]==s[j])//两端颜色相同
          f[i][j]=min(f[i+1][j],f[i][j-1]);
        else{//区间dp
          for(int k=i;k<j;k++)
          f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
        }
      }
      cout<<f[0][n-1];
}

制作回文串(蓝桥官网1547)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e3+9;
string s;
int n,m,w1[30],w2[30],f[N][N];
signed main(){
  cin>>m>>n>>s;
  for(int i=1;i<=m;i++){
    char ch;cin>>ch;
    cin>>w1[ch-'a']>>w2[ch-'a'];
  }
  for(int len=2;len<=n;len++)
    for(int i=0;i+len-1<n;i++){
      int j=i+len-1;
      if(s[i]==s[j]){//左右同色
        if(len==2) f[i][j]==0;
        else f[i][j]=f[i+1][j-1];
      }
      else //区间dp
      f[i][j]=min(f[i+1][j]+min(w1[s[i]-'a'],w2[s[i]-'a']),
                  f[i][j-1]+min(w1[s[j]-'a'],w2[s[j]-'a']));
    }
    cout<<f[0][n-1];
}

环形区间DP

在这里插入图片描述
在这里插入图片描述

能量项链(蓝桥官网557)

请添加图片描述

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=209;
int n,a[N*2],dp[N*2][N*2];
signed main(){
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  cin>>n;
  for(int i=1;i<=n;i++){
    cin>>a[i];
    a[n+i]=a[i];//环形区间dp,复制
  }
  for(int len=2;len<=n;len++)
  for(int i=1;i+len-1<=n*2;i++){
      int j=i+len-1;
      for(int k=i;k<j;k++)
      dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]);
  }
  int ans=0;
  for(int i=1;i<=n;i++)
  ans=max(ans,dp[i][i+n-1]);
  cout<<ans;
}

标签:min,int,cin,len,long,区间,动态,DP
From: https://blog.csdn.net/2302_79519348/article/details/137249839

相关文章

  • 【嵌入式智能产品开发实战】(十四)—— 政安晨:通过ARM-Linux掌握基本技能【链接静态库与
    目录链接静态库动态链接与地址无关的代码全局偏移表延迟绑定共享库政安晨的个人主页:政安晨欢迎 ......
  • P7219 [JOISC2020] 星座 3【笛卡尔树+整体dp】
    P7219[JOISC2020]星座3笛卡尔树+整体dp(线段树合并维护dp)考虑转化题意,不存在矩形为星座,即对于每个极大矩形中都只有一颗星星。而观察题目的方格,对于两个位置是否能够成为一个矩形,只和两个位置的区间最大值(小白船的位置)有关①。图中的红蓝矩形即为两个极大矩形。将删除星......
  • 三道dp的题解报告
    三道dp的题解报告圆题目来源牛客练习赛122D题练习赛链接https://ac.nowcoder.com/acm/contest/75768题面原题面为中文就直接放原题面截图了。解法事实上,把\(n\)与\(1\)断掉,断环为链,把原来的线段看成区间,线段相交就是区间之间部分覆盖(区间有重复部分但是没有相互包含关......
  • 动态sql实现修改
     在Mybatis内,根据某个条件进行修改,普通修改进行选择性修改时会对未修改的字段进行null了。使用动态sql,<if></if>进行判空实现。if与test属性联合使用。<updateid="updateDictById">updatexz_dict_type<set>......
  • k 不相交区间
    题意:给定一个序列,要求从中选出\(k\)个不相交的区间使和最大。\(n\le10^5\)。如果DP,至少\(O(n^2)\)。而这题可以模拟费用流做。【费用流模型】建立\(n+1\)个点\(p_1\simp_{n+1}\),\(p_i\rightarrowp_{i+1}\)容量\(1\)费用\(a_i\)。\(S\rightarrowp_1\simp_n\)......
  • vue3+ant-design-vue - 最新实现“侧边动态导航栏+面包屑导航“功能,vue3+ant后台管理
    效果图在vue3+antdesignvue后台管理系统中,详细完成菜单导航+面包屑动态联动功能效果,支持缓存功能、配置简洁、自动跟随route路由进行变化、自动匹配菜单和面包屑导航的文字等,超详细实用的示例demo全部源代码。提供详细示例源代码,新手小白直接复制稍微改下配置就能用了,快......
  • Python加载C语言动态库
    ★背景说明1.python是一门胶水语言,可以通过加载动态库的方式在一个项目中运行不同语言的程序2.通过动态库加载其他语言的方式可以解决多线程GIL使用C解释器无法并发运行的问题★在Linux中运行C代码:编辑C语言代码//hello.c//c代码作为启动文件必须加include<stdio......
  • 数位 dp / lianggj 让你学小专题应该怎么办
    P4999#include<bits/stdc++.h>#defineintlonglong#defineup(i,l,r)for(inti=l;i<=r;++i)#definedn(i,r,l)for(inti=r;i>=l;--i)usingnamespacestd;constintN=20,M=9*18+5,P=1e9+7;intt,l,r,f[N][M],a[N],len,ans;/*Q:查询......
  • 状压dp板子(cf div4 #937)
    #include<bits/stdc++.h>usingnamespacestd;intn;vector<int>v[20];stringa[20],b[20];booldp[500010][20];voiddfs(ints,intnow){dp[s][now]=true;for(autonxt:v[now]){if(s&(1<<nxt))continue;......
  • RudderStack 开源CDP 平台
    RudderStack是基于golang开发的开源CDP平台包含的特性eventstreaming 支持16+sdkprofiles 快速基于dw或者datalake构建客户画像reverseetl 支持反向etl数据治理 支持增强追踪,方便对于一些隐私数据的管理event转换 支持基于js以及python进行数据修复200+......