P5985
不妨在 Trie 树上考虑这个问题。
首先建一颗树:
这样一来,对于
先考虑 DP,设
我们考虑一个节点
明显,这里无法枚举所有 Trie 树上的点。但是又发现,同一层上的点除了高位限制以外,本质上是一样的。
所以我们改进一下 DP 数组的定义。
据说还可以四边形不等式优化,就看别的奆佬的题解吧(笑。
再仔细一想,发现它竟然和数位 DP 一模一样,其实这本质上是一致的。可是第一眼确实想不太到数位 DP。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=210,M=61;
int n,s[N][N];
ll f[M][N][N][2],a[N],m;
inline ll max(ll x,ll y){
return x>y?x:y;
}
int main(){
memset(f,-0x3f,sizeof f);
scanf("%d%lld",&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
a[i]+=a[i-1];
f[0][i][i][0]=f[0][i][i][1]=0;
}
for(int i=0;i<M;++i) for(int j=1;j<=n+1;++j) f[i][j][j-1][0]=f[i][j][j-1][1]=0;
for(int i=1;i<M;++i)
for(int l=1;l<=n;++l)
for(int r=l;r<=n;++r){
if(m&(1ll<<i-1)) for(int k=l-1;k<=r;++k) f[i][l][r][1]=max(f[i][l][r][1],f[i-1][l][k][0]+f[i-1][k+1][r][1]+a[r]-a[k]);
else f[i][l][r][1]=f[i-1][l][r][1];
for(int k=l-1;k<=r;++k) f[i][l][r][0]=max(f[i][l][r][0],f[i-1][l][k][0]+f[i-1][k+1][r][0]+a[r]-a[k]);
}
printf("%lld",f[M-1][1][n][1]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】