思路:
我想知道为什么树形dp中会出一道区间dp的练习题。。。起码我是用区间dp解决的。
#include<cstdio> #include<iostream> #include<cstdlib> using namespace std; const int maxn = 3010; void qread(long long &x) { x = 0; register int ch = getchar(); while(ch < '0' || ch > '9') ch = getchar(); while(ch >= '0' && ch <= '9') x = 10 * x + ch - 48, ch = getchar(); } long long n; long long dp[maxn][maxn]; int pos[maxn][maxn]; void show(int l, int r){ if(l > r) return ; cout << pos[l][r] << " "; show(l, pos[l][r] - 1); show(pos[l][r] + 1, r); } int main(void){ qread(n); for(int i=0; i<=n; ++i) for(int j=0; j<=n; ++j) dp[i][j] = 1; for(int i=1; i<=n; ++i) pos[i][i] = i; for(int i=1; i<=n; ++i) qread(dp[i][i]); for(int L=1; L<n; ++L){ for(int i=1; i+L<=n; ++i){ int j = i + L; for(int k=i; k<=j; ++k){ int t = dp[i][k-1] * dp[k+1][j] + dp[k][k]; if(dp[i][j] < t){ dp[i][j] = t; pos[i][j] = k; } } } } cout << dp[1][n] << endl; show(1, n); }