Vijos 1100 加分二叉树(树形DP)
2013-03-10 18:53
267 查看
题目链接
感觉和区间DP很类似,觉得还挺简单的,难得1Y,以前的时候直接没思路。。。
感觉和区间DP很类似,觉得还挺简单的,难得1Y,以前的时候直接没思路。。。
#include <cstdio> #include <cstring> #include <queue> #include <string> using namespace std; #define LL long long int p[101]; int o[101]; LL dp[101][101]; int num = 1; LL dfs(int L,int R) { int i; LL temp; LL maxz = -1000000; if(dp[L][R]) return dp[L][R]; if(L > R) return 1; if(L == R) return p[L]; for(i = L;i <= R;i ++) { if(maxz < (temp = dfs(L,i-1)*dfs(i+1,R)+p[i])) { maxz = temp; } } dp[L][R] = maxz; return dp[L][R]; } void find(int L,int R) { int i,key; if(L == R) { o[num++] = L; return ; } else if(L > R) return ; for(i = L;i <= R;i ++) { if(dp[L][R] == dfs(L,i-1)*dfs(i+1,R)+p[i]) { key = i; break; } } o[num++] = key; find(L,key-1); find(key+1,R); } int main() { int i,n; scanf("%d",&n); for(i = 1;i <= n;i ++) scanf("%d",&p[i]); printf("%lld\n",dfs(1,n)); find(1,n); for(i = 1;i <= n;i ++) { if(i == 1) printf("%d",o[i]); else printf(" %d",o[i]); } printf("\n"); return 0; }
相关文章推荐
- vijos1100 加分二叉树 ( dp)
- Vijos P1100 加分二叉树(区间DP,树形DP)
- code vs 1090 加分二叉树 (树形DP)
- [CODEVS1090][NOIP2013]加分二叉树(树形dp)
- Cpp环境【NOIP2003 P3】【Vijos1100】【Code[VS]1090】【CQYZOS2816】加分二叉树
- VJP1100 加分二叉树(树形DP)
- P1040 加分二叉树(树形dp)
- vijos1100 加分二叉树
- 加分二叉树(树形dp)
- [洛谷 1070]加分二叉树---树形DP
- 加分二叉树 树形DP
- RQNOJ 49 加分二叉树 (树形DP)
- 树形dp 加分二叉树 / 11.05.15
- 树形dp 加分二叉树 / 11.05.15
- [树形DP]加分二叉树
- 加分二叉树(树形dp)
- Vijos 1100 加分二叉树
- 【树形DP】[NOIP2003]加分二叉树
- [Swust OJ 360]--加分二叉树(区间dp)
- 选课 树形DP 多叉树转二叉树