石子合并问题

相邻石子合并问题

代码

#include<bits/stdc++.h> using namespace std; #define rep(i,a,n) for(int i = a; i <= n; i++) const int N = 330; int sum[N]; int a[N]; int f[N][N];//从i到j合并石子所付出的最小代价 int main(){ int n;cin>>n; rep(i,1,n){ cin >> a[i]; sum[i] += sum[i - 1] + a[i]; } rep(len,2,n){//长度 rep(i,1,n- len + 1){//左端点 int l = i, r = i + len - 1;//右端点 f[l][r] = 1e9;//初始化为最大值 rep(k,l,r -1){ f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r] + sum[r] - sum[l - 1]);//动态规划 } } } cout << f[1][n] << endl; return 0; }

环形石子合并问题

#include<iostream> using namespace std; #define rep(i,a,n) for(int i = (a); i <= (n); i++) const int N = 500; int f[N][N],v[N][N]; int a[N],sum[N]; int main(){ int n; cin >> n; rep(i,1,n){ cin >> a[i]; a[i + n] = a[i]; } rep(i,1,2 * n){ sum[i] = sum[i - 1] + a[i]; } rep(len,2,n){ rep(l,1,2 * n - len + 1){ int r = l + len - 1; f[l][r] = 1e9; rep(k,l,r - 1){ f[l][r] = min(f[l][r],f[l][k] + f[k + 1][r] + sum[r] - sum[l - 1]); v[l][r] = max(v[l][r],v[l][k] + v[k + 1][r] + sum[r] - sum[l - 1]); } } } int ans1 = 1e9, ans2 = 0; for(int i = 1; i <= n; i++){ ans1 = min(ans1,f[i][i + n - 1]); ans2 = max(ans2,v[i][i + n - 1]); } cout << ans1 << endl; cout << ans2; return 0; }

__EOF__

本文作者WangZhenHui
本文链接https://www.cnblogs.com/index-12/p/17280022.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   天黑星更亮  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示