A 魔力屏障
A 魔力屏障
我们考虑设
初始状态:对于所有区间为
转移,考虑先击破
发现
#include<iostream>
#include<cstring>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
const int N=75,M=160;
int n,a[N],f[N][N][M],m;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
memset(f,0x3f,sizeof f);
cin>>n;
E(i, n)cin>>a[i],m=max(m,a[i]);
E(i, n){
f[i][i][a[i]>>1]=a[i];
Le(j, (a[i]>>1)+1, m)f[i][i][j]=j<<1;//可略去
}
Le(len, 2, n)
for(int l=1;l+len-1<=n;++l){
int r=l+len-1;
Le(mid, l+1, r){
Le(p, a[r]>>1, m)
Le(k, a[r]>>1, p)
f[l][r][p]=min(f[l][r][p],f[l][mid-1][p-k]+f[mid][r][k]);
}
L(p, m+1){
int nxt=max(p,a[r])>>1;
f[l][r][nxt]=min(f[l][r][nxt],f[l][r-1][p]+max(0,a[r]-p));
}
}
E(i, n){
int ret=1e9;
Le(k, a[i]>>1, m)
ret=min(ret,f[1][i][k]);
cout<<ret<<' ';
}
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17771321.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步