mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-09-05 17:50:36 +00:00
refactor(P4342.cpp): 优化动态规划实现并修复计算逻辑
重构动态规划的实现方式,将原来的双重循环改为基于长度的遍历,提高代码可读性和效率。同时修复了最大值和最小值的计算逻辑,确保正确处理加法和乘法操作。添加结果收集和输出部分,完善程序功能。
This commit is contained in:
parent
84eee83148
commit
22e2db73d9
@ -24,6 +24,7 @@ dpmin[i][j] = 1e9
|
|||||||
dp[i][i]=arr[i]
|
dp[i][i]=arr[i]
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
#include <algorithm>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <istream>
|
#include <istream>
|
||||||
@ -51,17 +52,61 @@ int main(){
|
|||||||
op[i+n]=op[i];
|
op[i+n]=op[i];
|
||||||
}
|
}
|
||||||
std::vector<std::vector<ll>> dpmax,dpmin;
|
std::vector<std::vector<ll>> dpmax,dpmin;
|
||||||
for(ll s=1;s<n;s++){
|
|
||||||
ll e = s+n-1;
|
|
||||||
dpmax.clear();
|
dpmax.clear();
|
||||||
dpmax.resize(n21,std::vector<ll>(n21,-1e9));
|
dpmax.resize(n21,std::vector<ll>(n21,-1e9));
|
||||||
dpmin.clear();
|
dpmin.clear();
|
||||||
dpmin.resize(n21,std::vector<ll>(n21,1e9));
|
dpmin.resize(n21,std::vector<ll>(n21,1e9));
|
||||||
for(ll i=s;i<=e;i++){
|
for(ll i=1;i<=2*n;i++){
|
||||||
dpmax[i][i]=op[i][1];
|
dpmax[i][i]=op[i][1];
|
||||||
|
dpmin[i][i]=op[i][1];
|
||||||
}
|
}
|
||||||
for(ll i=s;i<=e;i++){
|
for(ll len=2;len<=n;len++){
|
||||||
|
for(ll i=1;i<=2*n-len;i++){
|
||||||
|
ll j=i+len-1;
|
||||||
|
for(ll k=i;k<j;k++){
|
||||||
|
if(op[k+1][0]==add){ //注意是k+1
|
||||||
|
dpmax[i][j]=std::max(
|
||||||
|
dpmax[i][k]+dpmax[k+1][j],
|
||||||
|
dpmax[i][j]
|
||||||
|
);
|
||||||
|
dpmin[i][j]=std::min(
|
||||||
|
dpmin[i][k]+dpmin[k+1][j],
|
||||||
|
dpmin[i][j]
|
||||||
|
);
|
||||||
|
}else{
|
||||||
|
dpmax[i][j]=std::max({
|
||||||
|
dpmax[i][j],
|
||||||
|
dpmax[i][k]*dpmax[k+1][j],
|
||||||
|
dpmin[i][k]*dpmin[k+1][j],
|
||||||
|
dpmax[i][k]*dpmin[k+1][j],
|
||||||
|
dpmin[i][k]*dpmax[k+1][j]
|
||||||
|
});
|
||||||
|
dpmin[i][j]=std::min({
|
||||||
|
dpmin[i][j],
|
||||||
|
dpmax[i][k]*dpmax[k+1][j],
|
||||||
|
dpmin[i][k]*dpmin[k+1][j],
|
||||||
|
dpmax[i][k]*dpmin[k+1][j],
|
||||||
|
dpmin[i][k]*dpmax[k+1][j]
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
ll ans=-1e9;
|
||||||
|
std::vector<ll> edgs;
|
||||||
|
for(ll i=1;i<=n;i++){
|
||||||
|
ll nans=dpmax[i][i+n-1];
|
||||||
|
if(nans>ans){
|
||||||
|
ans=nans;
|
||||||
|
edgs.clear();
|
||||||
|
edgs.push_back(i);
|
||||||
|
}else if(nans==ans){
|
||||||
|
edgs.push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout<<ans<<"\n";
|
||||||
|
for(ll i:edgs){
|
||||||
|
std::cout<<i<<" ";
|
||||||
|
}
|
||||||
|
std::cout<<"\n";
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user