码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-13 19:57:39      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

标签:

原文地址:http://www.cnblogs.com/xiaoshanshan/p/4290829.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!