动态规划(二)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划(二)相关的知识,希望对你有一定的参考价值。
动态规划(二)
uva437 巴比伦塔
题目链接:https://vjudge.net/problem/UVA-437
题意:这题可以看做是三维的DAG问题。
#include<iostream> #include<cstring> #include<algorithm> using namespace std; #define maxn 92 int dp[maxn], dps[maxn]; int G[maxn][maxn]; int k; int x[maxn], y[maxn]; int dp_find(int i) { int& ans = dps[i]; if (ans > 0) return ans; ans = dp[i]; for (int j = 0; j < k; j++){ if (G[i][j]){ ans = max(ans, dp_find(j) + dp[i]); } } return ans; } int main() { int T, kase; kase = 0; while (scanf("%d",&T)!=EOF&&T){ int a[3]; int ans; k = 0; for (int j = 0; j < T; j++){ cin >> a[0] >> a[1] >> a[2]; for (int i = 0; i < 3; i++){ dp[k] = a[i]; if (a[(i + 1) % 3] < a[(i + 2) % 3]){ x[k] = a[(i + 1) % 3]; y[k] = a[(i + 2) % 3]; } else{ x[k] = a[(i + 2) % 3]; y[k] = a[(i + 1) % 3]; } k++; } } memset(G, 0, sizeof(G)); for (int i = 0; i < k;i++) for (int j = 0; j < k; j++){ if (x[i] < x[j] && y[i] < y[j]){ G[i][j] = 1; } } memset(dps, 0, sizeof(dps)); ans = 0; for (int i = 0; i < k; i++){ if (dp_find(i)>ans) ans = dp_find(i); } printf("Case %d: maximum height = %d\n", ++kase, ans); } return 0; }
以上是关于动态规划(二)的主要内容,如果未能解决你的问题,请参考以下文章
算法动态规划 ⑤ ( LeetCode 63.不同路径 II | 问题分析 | 动态规划算法设计 | 代码示例 )
算法动态规划 ⑤ ( LeetCode 63.不同路径 II | 问题分析 | 动态规划算法设计 | 代码示例 )
算法动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )
算法动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )
算法动态规划 ③ ( LeetCode 62.不同路径 | 问题分析 | 自顶向下的动态规划 | 自底向上的动态规划 )