标签:
由于事情的耽误,导致第二天出来的有点慢,今天是我学动态规划的第二天,做了一个DAG上的最长路。一个立方体的高有三个,然后判断个点之间是否可以连接,然后DAG搞定
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define REP(i,N) for(int i = 0;i < (N);i++) using namespace std; int a[100][3]; int G[100][100]; int visit[100]; int N; int check(int i,int j) { if ((a[i][0] < a[j][0] && a[i][1] < a[j][1]) || (a[i][1] < a[j][0] && a[i][0] < a[j][1])) return 1; return 0; } int dp(int u) { if (visit[u]) return visit[u]; int ans = 0; REP(i,N) if (G[u][i]){ ans = max(ans,dp(i)); } visit[u] = ans + a[u][2]; return visit[u]; } int main () { int kase = 0; //freopen("1.txt","r",stdin); while (cin >> N,N) { REP(i,N) { REP(j,3) cin >> a[i][j]; a[N + i][0] = a[i][0];a[N + i][1] = a[i][2];a[N + i][2] = a[i][1]; a[N * 2 + i][0] = a[i][2];a[N * 2 + i][1] = a[i][1];a[N * 2 + i][2] = a[i][0]; } N *= 3; memset(G,0,sizeof(G)); REP(i,N) REP(j,N) { G[i][j] = check(i,j); } int ans = 0; memset(visit,0,sizeof(visit)); REP(i,N) { ans = max(ans,dp(i)); } printf("Case %d: maximum height = %d\n",++kase,ans); } }
标签:
原文地址:http://www.cnblogs.com/xiaoshanshan/p/4290829.html