区间dp-进阶题目1(进阶合并)

解题思路

这题区间dp用的很妙。我们先用dp数组存储区间内能合并的值,如果无法合并存为-1。之后再用线性dp记录前iii个数能合并的最小值。

AC Code

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
int n,a[maxn],f[maxn],dp[maxn][maxn];
int main(){
	cin>>n;
	memset(f,0x3f,sizeof(f));
	f[0]=0;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
		dp[i][i]=a[i];
	}
	for(int lenn=2;lenn<=n;lenn++){
		for(int l=1,r=lenn+l-1;r<=n;l++,r++){
			dp[l][r]=-1;
			for(int k=l;k<r;k++)
				if(dp[l][k]==dp[k+1][r]&&dp[l][k]!=-1)
					dp[l][r]=dp[l][k]+1;
		}
	}
	for(int i=1;i<=n;i++){
		if(dp[1][i]>-1){
			f[i]=1;
			continue;
		}
		f[i]=f[i-1]+1;
		for(int j=1;j<i-1;j++){
			if(dp[j+1][i]>-1) f[i]=min(f[i],f[j]+1);
		}
	}
	cout<<f[n];
	return 0;
} 
相关推荐
Matthew_zhu_1 小时前
P3374 【模板】树状数组 1 题解
算法
伶俜661 小时前
鸿蒙原生应用实战(四)ArkUI 语音变声器:录音 + 4 种音效 + 音调变换算法
算法·华为·harmonyos
王老师青少年编程1 小时前
2022年CSP-X复赛真题及题解(T2:移动棋子)
c++·真题·csp·信奥赛·复赛·csp-x·移动棋子
玖玥拾1 小时前
C/C++ 数据结构(三)链表核心算法
c语言·数据结构·c++·链表
AKA__Zas1 小时前
芝士算法(滑动窗口片 2.0)
java·算法·leetcode·学习方法
变量未定义~2 小时前
摆放小球 、dp求解组合数、求解组合数2
数据结构·算法
Sunsets_Red2 小时前
ABC462D 题解
c++·数学·编程·比赛·atcoder·信息学竞赛·信息学
喵星人工作室2 小时前
C++火影忍者1.1.8
开发语言·c++·游戏
凡人叶枫2 小时前
Effective C++ 条款26:尽可能延后变量定义式的出现时间
linux·开发语言·c++·effective c++