- 题意:消除相同相邻方块获得消除长度的平方,求消完后最大获得值
- 思路:容易想到贪心,可是长度的不确定性,以及平方的难以处理。还有数据范围告诉我们用高维dp
首先容易想到状态[l,r]表示消完该范围的最大获得值。但是显然无法处理消后合并的情况。合并怎么搞?会发现我们提前用到合并操作的时候是两端相同才有意义,不然我们采用从后往前消的策略。然后便会想到存储一维右边相等颜色块的个数。
然后决策:直接消完右端或者取中间一点p满足a[p]==a[r]且a[p+1]!=a[r]然后我们删[p+1,q−1]就非常的方便可爱。
- 代码:
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int N=205;
int dp[N][N][N],a[N];
int DP(int l,int r,int k) {
if(dp[l][r][k]!=-1) return dp[l][r][k];
if(l>r) return 0;
int p,q=r,mx=0;
while(q>1&&a[q-1]==a[r]) q--;
mx=max(mx,DP(l,q-1,0)+(r+k-q+1)*(r+k-q+1));
for(p=l;p<q;p++) {
if(a[p]==a[r]&&a[p+1]!=a[r]) {
mx=max(mx,DP(l,p,r+k-q+1)+DP(p+1,q-1,0));
}
}
return dp[l][r][k]=mx;
}
int main() {
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
memset(dp,-1,sizeof(dp));
printf("%d",DP(1,n,0));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人