首页 > 其他分享 >dp题单——区间dp

dp题单——区间dp

时间:2022-11-19 01:33:18浏览次数:72  
标签:0x3f int long https 区间 dp 题单

一、基本概念

1、链式区间dp
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 ++){ // 中间变量位置
				dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + cost[i][j]);
			}
		}
	}
2、环形区间dp:把范围扩大一倍,从f[1][n],f[2][n + 1]中寻找最优解

image

3、关于区间dp的更新状况

每次对固定区间长度进行更新,更新顺序遵循由小区间到大区间。

二、区间dp适用情况

image

三、相关题目

1、Zuma
#include<bits/stdc++.h>
using namespace std;

const int N = 510;
int dp[N][N], a[N], n;
//dp[i][j]表示合并区间[i][j]所需要的最少步数

signed main(){
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	memset(dp, 0x3f, sizeof dp);
	for(int i = 1; i <= n; i++){
		dp[i][i] = 1;
		if(a[i] == a[i + 1]) dp[i][i + 1] = 1;
		else dp[i][i + 1] = 2;
	}
	for(int len = 2; len <= n; len++){
		for(int i = 1; i + len - 1 <= n; i++){
			int j = i + len - 1;
			//必须要有j - i > 1,因为j - i == 1这种情况在初始化已经被更新了,且是最优值
			//为什么当相等的时候,直接由dp[i+1][j-1]转移过来呢?
			//因为区间[i+1,j-1]合并到最后会剩下一个回文串,回文串两端加上相同的字母还是回文串,合并次数不变 
			if(a[i] == a[j] && j - i > 1) {
				dp[i][j] = dp[i + 1][j - 1];
			}
			for(int k = i; k < j; k++){
				dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
			}
		}
	}
	cout << dp[1][n] << endl;
	return 0;
}
2、Minimum Triangulation

简单区间dp

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 510;
int dp[N][N], a[N], n;

signed main(){
	cin >> n;
	memset(dp, 0x3f, sizeof dp);
	for(int i = 1; i <= n; i++){//区间内只有一个数或者区间内只有两个数,不能组成三角形
		dp[i][i] = 0;
		dp[i][i + 1] = 0;
	}
	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++){//其他题目区间是不包含关系,所以是k+1
				dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + i * k * j);
			}
		}
	}
	cout << dp[1][n] << endl;
	return 0;
}
3、Array Shrinking

思路非常棒的一道题,代码量比较小,不好想

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 510;
int dp[N][N], a[N], n;//dp表示区间长度(即区间内所剩余的数的个数)
int v[N][N];//记录区间[i][j]合并后所剩的一个数的值(如果可以)

signed main(){
	cin >> n;
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
		v[i][i] = a[i];//注意这个敌方的初始化
	}
	memset(dp, 0x3f, sizeof dp);
	for(int i = 1; i <= n; i++){
		for(int j = i; j <= n; j++){
			dp[i][j] = j - i + 1;//求区间长度
		}
	}
	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++){
				dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
				if(dp[i][k] == 1 && dp[k + 1][j] == 1 && v[i][k] == v[k + 1][j]){//合并条件还是蛮好理解的
					dp[i][j] = 1;
					v[i][j] = v[i][k] + 1;
				}
			}
		}
	}
	cout << dp[1][n] << endl;
	return 0;
}
4、Clear the String

这个状态转移方程写的太妙了!爱了爱了。
image

5、矩阵取数游戏

image

参考博客:

1、https://www.cnblogs.com/ljy-endl/p/11610549.html
2、https://blog.csdn.net/Gonhz/article/details/105361300
3、https://www.luogu.com.cn/problem/solution/CF1132F
4、https://blog.csdn.net/m0_57344422/article/details/118085490

标签:0x3f,int,long,https,区间,dp,题单
From: https://www.cnblogs.com/N-lim/p/16905349.html

相关文章

  • 20221005_T1C_思维dp
    题意一开始有\(n\)个颜色为黑白的球,但不知道黑白色分别有多少,\(m\)次操作,每次先拿出一个球,再放入黑白球各一个,再拿出一个球,最后拿出的球按顺序排列会形成一个颜色序列......
  • tcp和udp:发送和接收工具
    字符串转16进制字符串''' 主要使用到了binascii内置模块'''代码'''将字符串转为对应的16进制:params需要转换的内容:parambyteslens转换完后的长......
  • dp交换值域定义域
    前言最近心血来潮学了一下这个套路?感觉很高级qwq。正文我不好归纳,但他们大体都是一样的。T1[AGC033D]Complexity题意给定一个\(N\)行\(M\)列的字符矩阵。......
  • codeforces 2000左右dp题目练习
    栾巨的dp题单,刷完他要v我500可以提升dp水平。1.YaroslavandTwoStrings白给题,令\(f_{i,0/1,0/1}\)表示前\(i\)位,有无小于,有无大于,根据每位的字符转移即可。2.To......
  • dpm中的参数和颗粒数据读取
    rho0表示颗粒密度。sizeDistribution中的fixedvaludedistribution的value值表示颗粒直径(可以设置不同的直径分布函数和固定值)。cloudFunction中可以设置关于cloud的不同......
  • 【SSL 1590】旅游(线段树优化DP)
    旅游题目链接:SSL1590题目大意要从x号点依次按编号走到y号点,每次可以选择跳最多z个点,即从i到i+z。每到一个点都要支付a的费用,到一些给出的特定点有其对应的......
  • 闫式DP分析法
    闫式DP分析法闫式DP分析法的核心思想是从集合的角度来分析DP问题。所有的DP问题都可以使用闫式DP分析法进行分析。(经过70道题目验证通过)1.选择DP问题:背包模型2.序列DP......
  • python基础入门之黏包、UDP代码、多道技术、进程
    python基础入门之黏包、UDP代码、多道技术、进程目录python基础入门之黏包、UDP代码、多道技术、进程黏包现象黏包的解决方案UDP基本代码使用并发编程理论之操作系统发展......
  • UDP协议和实战、并发编程理论、多道技术、进程理论
    今日内容UDP协议和实战并发编程理论多道技术进程理论进程的并行与并发进程的三状态UDP协议#客户端importsocket#指定使用UDP协议,不指定的话......
  • 进入python的世界_day33_网络编程—— 黏包现象、UDP协议、并发编程理论
    一、黏包现象1.何为黏包​ 流逝协议:所有的数据类似于水流连接在一起的​ 数据量很小并且时间间隔很多那么就会自动组织到一起recv​ 我们不知道即将要接收的......