loj10151. 「一本通 5.1 练习 2」分离与合体
Posted junk-yao-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了loj10151. 「一本通 5.1 练习 2」分离与合体相关的知识,希望对你有一定的参考价值。
思路:
注意初始化dp[i][i]=0,输出顺序时层序遍历。
#include<cstdio> #include<iostream> #include<string> #include<queue> using namespace std; const int maxn = 310; void qread(int &x){ x = 0; register int ch = getchar(); if(ch < ‘0‘ || ch > ‘9‘) ch = getchar(); while(ch >= ‘0‘ && ch <= ‘9‘) x = 10 * x + ch - 48, ch = getchar(); } int data[maxn]; int n; int dp[maxn][maxn]; int sum[maxn]; int pos[maxn][maxn]; queue<pair<int, int> > qu; void show(int l, int r){ if(l == r) return ; cout << pos[l][r] << " "; qu.push(make_pair(l, pos[l][r])); qu.push(make_pair(pos[l][r] + 1, r)); while(!qu.empty()){ int a = qu.front().first, b = qu.front().second; qu.pop(); show(a, b); } } int main(void){ qread(n); for(int i = 1; i<=n; ++i){ qread(data[i]); dp[i][i] = 0; sum[i] = sum[i-1] + data[i]; } for(int L = 1; L < n; ++L) for(int i = 1; i + L <= n; ++i){ int j = i + L; dp[i][j] = 0; for(int k = i; k < j; ++k){ int t = dp[i][k] + dp[k + 1][j] + (data[i] + data[j]) * data[k]; if(t > dp[i][j]){ dp[i][j] = t; pos[i][j] = k; } } } printf("%d ", dp[1][n]); show(1, n); }
以上是关于loj10151. 「一本通 5.1 练习 2」分离与合体的主要内容,如果未能解决你的问题,请参考以下文章
loj10195. 「一本通 6.1 练习 2」转圈游戏 (loj2608)