uva 437 ( 动态规划起步第二天 DAG)

由于事情的耽误,导致第二天出来的有点慢,今天是我学动态规划的第二天,做了一个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);
    }
}

 

posted @ 2015-02-13 19:20  闪光阳  阅读(104)  评论(0编辑  收藏  举报