feat: 实现石子合并问题的动态规划解法

添加完整的动态规划实现来计算石子合并问题的最小和最大得分
优化输入输出性能并修复原未实现的代码
This commit is contained in:
Zengtudor 2025-08-29 12:04:25 +08:00
parent 22e2db73d9
commit 91aa4d02bc
2 changed files with 54 additions and 32 deletions

View File

@ -1,32 +0,0 @@
/*
*/
#include <cstdint>
#include <iostream>
#include <stdexcept>
#include <vector>
using ll = int64_t;
int main(){
ll n;
std::cin>>n;
std::vector<ll> arr(n*2+1);
std::vector<ll> pre(n*2+1);
for(ll i=1;i<=n;i++){
std::cin>>arr[i];
arr[n+i]=arr[i];
}
for(ll i=1;i<=2*n;i++){
pre[i]=pre[i-1]+arr[i];
}
std::vector<std::vector<ll>> dp;
for(ll i=1;i<n;i++){
ll j=i+n-1;
dp.clear();
dp.resize(2*n+1,std::vector<ll>(2*n+1,1e9));
// for(ll x=1;)
throw std::runtime_error("NotImpletmented");
}
}

54
src/8/29/P1880.cpp Normal file
View File

@ -0,0 +1,54 @@
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
const ll inf=1e9;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
ll n;
std::cin>>n;
std::vector<std::vector<ll>> dpmax(2*n+1,std::vector<ll>(2*n+1,-inf)),
dpmin(2*n+1,std::vector<ll>(2*n+1,inf)),
cost(2*n+1,std::vector<ll>(2*n+1));
for(ll i=1;i<=n;i++){
std::cin>>cost[i][i];
cost[n+i][n+i]=cost[i][i];
dpmin[i][i]=dpmax[i][i]=0;
dpmin[n+i][n+i]=dpmax[n+i][n+i]=0;
}
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++){
cost[i][j]=cost[i][k]+cost[k+1][j];
}
}
}
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++){
dpmax[i][j]=std::max(dpmax[i][j],dpmax[i][k]+dpmax[k+1][j]+cost[i][j]);
dpmin[i][j]=std::min(dpmin[i][j],dpmin[i][k]+dpmin[k+1][j]+cost[i][j]);
}
}
}
ll minans=inf,maxans=-inf;
for(ll i=1;i<=n;i++){
minans=std::min(minans,dpmin[i][i+n-1]);
maxans=std::max(maxans,dpmax[i][i+n-1]);
}
std::cout<<minans<<"\n"<<maxans<<"\n";
}