C++区间DP

区间DP代码框架见下 对应蓝桥云课 石子合并 代码见下

cpp 复制代码
#include <iostream>
using namespace std;

#define type int
#define maxn 210
//dp[i][j]就代表了区间[i,j]的元素最优值
type dp[maxn][maxn];
int a[maxn], sum[maxn];
int n;

type IntervalDP_Opt(type a, type b){
  return min(a, b);
}

type IntervalDP_ValueInf(){
  return 1000000000;
}

type IntervalDP_ValueInit(){
  return 0;
}

type IntervalDP_CalcState(int l, int r){
  type ans = IntervalDP_ValueInf();
  for(int k = l; k < r; ++k){
    type v = dp[l][k] + dp[k+1][r] + (sum[r] - sum[l-1]);
    ans = IntervalDP_Opt(ans, v);
  }
  return ans;
}

type IntervalDP_Solve(int maxlen, int maxr){
  type ans = IntervalDP_ValueInf();
  // 1 枚举区间长度
  for(int i=1; i <= maxlen; ++i){
    // 2 枚举区间起点
    for(int j=1; j+i-1 <= maxr; ++j){
      int l = j;
      int r = j + i - 1;
      if(i == 1){
        dp[l][r] = IntervalDP_ValueInit();
      }else{
        dp[l][r] = IntervalDP_CalcState(l, r);
      }
      if(i == maxlen){
      ans = IntervalDP_Opt(ans, dp[l][r]);
      }
    }

  }
  return ans;
}

int main()
{
  cin >> n;
  for(int i=1; i <= n; ++i){
    cin >> a[i];
    sum[i] = sum[i-1] + a[i];
  }
  cout << IntervalDP_Solve(n, n) << endl;
  // 请在此输入您的代码
  return 0;
}

代码练习 1,对应蓝桥云课 小蓝吃苹果 代码见下

cpp 复制代码
#include <iostream>
using namespace std;

#define type int
#define maxn 510
//dp[i][j]就代表了区间[i,j]的元素最优值
type dp[maxn][maxn];
int a[maxn], sum[maxn];
int n;

type IntervalDP_Opt(type a, type b) {
    return min(a, b);
}

type IntervalDP_ValueInf() {
    return 1000000000;
}

type IntervalDP_ValueInit() {
    return 1;
}

type IntervalDP_CalcState(int l, int r) {
    type ans = IntervalDP_ValueInf();
    for (int k = l; k < r; ++k) {
        ans = IntervalDP_Opt(ans, dp[l][k] + dp[k + 1][r]);
    }
    if (a[l] == a[r]) {
        ans = IntervalDP_Opt(ans, dp[l + 1][r - 1] + (l + 1 == r));
    }
    return ans;
}

type IntervalDP_Solve(int maxlen, int maxr) {
    type ans = IntervalDP_ValueInf();
    // 1 枚举区间长度
    for (int i = 1; i <= maxlen; ++i) {
        // 2 枚举区间起点
        for (int j = 1; j + i - 1 <= maxr; ++j) {
            int l = j;
            int r = j + i - 1;
            if (i == 1) {
                dp[l][r] = IntervalDP_ValueInit();
            }
            else {
                dp[l][r] = IntervalDP_CalcState(l, r);
            }
            if (i == maxlen) {
                ans = IntervalDP_Opt(ans, dp[l][r]);
            }
        }

    }
    return ans;
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
    }
    cout << IntervalDP_Solve(n, n) << endl;
    // 请在此输入您的代码
    return 0;
}

代码练习2 对应蓝桥云课 课上小游戏 代码见下

cpp 复制代码
#include <iostream>
using namespace std;

#define type int
#define maxn 210
//dp[i][j]就代表了区间[i,j]的元素最优值
type dp[maxn][maxn];
int a[maxn], mul[maxn][maxn];
int n;

type IntervalDP_Opt(type a, type b){
  return max(a, b);
}

type IntervalDP_ValueInf(){
  return -1000000000;
}

type IntervalDP_ValueInit(){
  return 0;
}

type IntervalDP_CalcState(int l, int r){
  type ans = IntervalDP_ValueInf();
  for(int k=l; k<r; ++k){
    type a = mul[l][k];
    type b = mul[k+1][r];
    type v = dp[l][k] + dp[k+1][r] + a*b/10;
    ans = IntervalDP_Opt(ans, v);
  }
  return ans;
}

type IntervalDP_Solve(int maxlen, int maxr){
  type ans = IntervalDP_ValueInf();
  // 1 枚举区间长度
  for(int i=1; i <= maxlen; ++i){
    // 2 枚举区间起点
    for(int j=1; j+i-1 <= maxr; ++j){
      int l = j;
      int r = j + i - 1;
      if(i == 1){
        dp[l][r] = IntervalDP_ValueInit();
      }else{
        dp[l][r] = IntervalDP_CalcState(l, r);
      }
      if(i == maxlen){
      ans = IntervalDP_Opt(ans, dp[l][r]);
      }
    }

  }
  return ans;
}

int main()
{
  cin >> n;
  int n2 = n*2;
  for(int i=1; i<=n; ++i){
    cin >> a[i];
    a[n+i] = a[i];
  }
  for(int i=1; i<=n2; ++i){
    mul[i][i-1] = 1;
    for(int j=i; j<=n2; ++j){
      mul[i][j] = mul[i][j-1] * a[j] % 10;
    }
  }
  cout << IntervalDP_Solve(n, n2) << endl;
  // 请在此输入您的代码
  return 0;
}

代码练习3 对应蓝桥云课 涂色 代码见下

cpp 复制代码
#include <iostream>
#include <cstring>
using namespace std;

#define type int
#define maxn 55
//dp[i][j]就代表了区间[i,j]的元素最优值
type dp[maxn][maxn];
char a[maxn];
int n;

type IntervalDP_Opt(type a, type b){
  return min(a, b);
}

type IntervalDP_ValueInf(){
  return 1000000000;
}
//当区间长度为1的时候,该状态下的DP值
type IntervalDP_ValueInit(){
  return 1;
}

type IntervalDP_CalcState(int l, int r){
  type ans = IntervalDP_ValueInf();
  for(int k = l; k < r; ++k){
    ans = IntervalDP_Opt(ans, dp[l][k]+dp[k+1][r]);
  }
  if(a[l] == a[r]){
    ans = IntervalDP_Opt(ans, dp[l+1][r]);
    ans = IntervalDP_Opt(ans, dp[l][r-1]);
  }
  return ans;
}

type IntervalDP_Solve(int maxlen, int maxr){
  type ans = IntervalDP_ValueInf();
  // 1 枚举区间长度
  for(int i=1; i <= maxlen; ++i){
    // 2 枚举区间起点
    for(int j=1; j+i-1 <= maxr; ++j){
      int l = j;
      int r = j + i - 1;
      if(i == 1){
        dp[l][r] = IntervalDP_ValueInit();
      }else{
        dp[l][r] = IntervalDP_CalcState(l, r);
      }
      if(i == maxlen){
      ans = IntervalDP_Opt(ans, dp[l][r]);
      }
    }

  }
  return ans;
}

int main()
{
  cin >> &(a[1]);
  n = strlen(&a[1]);
  cout << IntervalDP_Solve(n, n) << endl;
  // 请在此输入您的代码
  return 0;
}
相关推荐
Mr_Xuhhh2 分钟前
算法刷题笔记:从滑动窗口到哈夫曼编码,我的算法进阶之路
开发语言·算法
草莓熊Lotso6 分钟前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·linux·运维·服务器·数据库·c++·mysql
MicroTech20258 分钟前
突破虚时演化非酉限制:MLGO微算法科技发布可在现有量子计算机运行的变分量子模拟技术
科技·算法·量子计算
唐樽11 分钟前
C++ 竞赛学习路线笔记
c++·笔记·学习
ShineWinsu12 分钟前
对于Linux:文件操作以及文件IO的解析
linux·c++·面试·笔试·io·shell·文件操作
hssfscv14 分钟前
软件设计师下午题六——Java的各种设计模式
java·算法·设计模式
珂朵莉MM23 分钟前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--多策略混合算法
人工智能·算法
罗西的思考30 分钟前
【OpenClaw】通过 Nanobot 源码学习架构---(6)Skills
人工智能·深度学习·算法
枫叶林FYL34 分钟前
【自然语言处理 NLP】7.2 红队测试与对抗鲁棒性(Red Teaming & Adversarial Robustness)
人工智能·算法·机器学习
qiqsevenqiqiqiqi35 分钟前
字符串模板
算法