mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-09-04 01:01:43 +00:00
feat: 实现石子合并问题的动态规划解法
添加完整的动态规划实现来计算石子合并问题的最小和最大得分 优化输入输出性能并修复原未实现的代码
This commit is contained in:
parent
22e2db73d9
commit
91aa4d02bc
@ -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
54
src/8/29/P1880.cpp
Normal 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";
|
||||
}
|
Loading…
Reference in New Issue
Block a user