区间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;
} 
相关推荐
专注仿真3 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
码爸3 小时前
支持向量机介绍与示例
算法·机器学习·支持向量机
怕浪猫3 小时前
2028编程圈很火的10个Skills
算法·面试·github
别动我齐刘海5 小时前
Linux 系统调试学习1
linux·运维·服务器·c++·学习·机器学习·机器人
Nil2088 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展
Shaoshing8 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
loulanyue_9 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法
碧海银沙音频科技研究院9 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
jimy19 小时前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++
爱吃提升10 小时前
Dev-C++ 5.11 C++断点调试完整教程
开发语言·c++