区间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;
} 
相关推荐
super大力张8 分钟前
MOE基于结构的药物设计(七):Ligand R-Vectors——如何判断配体可以从哪里继续生长?
数据库·算法·cadd·moe·svl·基于结构的药物设计
j7~37 分钟前
【C++】《unordered系列关联式容器以及哈希底层、哈希冲突、闭散列与开散列完整解析》
c++·哈希算法·开散列·闭散列·unordered_map·unordered_set·哈希底层结构
lvwangshu39 分钟前
P6534 [COCI 2015/2016 #1] UZASTOPNI 等差树列 题解
动态规划·图论·题解·性质题
Tongsr1 小时前
别只混淆代码:用 Kaleido 加固整个 Android Release AAB
前端·算法·github
高亦真1 小时前
今天是学习嵌入式的第34天
linux·学习·算法
2402_882893861 小时前
封装红黑树实现map和set —— 从源码到模拟实现
c++·set·map
飞Link2 小时前
动作方法中的分割与过度分割方法全解析(含代码实战与踩坑案例)
人工智能·python·算法·计算机视觉
神仙别闹3 小时前
基于C++ MFC 实现的智慧公交系统
开发语言·c++·mfc
张宇Joaquin3 小时前
鲲鹏统一并行加速库KUPL--异步数据拷贝
线性代数·算法·矩阵·numpy
GlobalInfo3 小时前
创新不是追逐热点,是在变化中建立长期竞争力
大数据·算法