mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-09-05 17:50:36 +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