【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

437 - The Tower of Babylon(记录结果再利用DP)

原创 2015年07月10日 20:23:37

最近准备进入动态规划的章节,仔细看了看紫书上对01背包的讲解,感觉很好。。之前看《挑战程序设计竞赛》那本书,就没有讲的那么深刻 。      更加深刻的理解了什么叫记录结果再利用,手工操作了一遍01背包的过程,也有点明白它的状态是如何转移的了,而且那个状态方程所构成的递推关系真的很巧妙 。

言归正传。。这道题就是嵌套矩形问题稍微改了一下,之前的嵌套矩形只需要维护一个状态量就行了,但是这道题是立方体,可以翻转的,所以还要维护一个特征量--高。

由于矩形的嵌套关系,每个状态只会出现一次,所以这么表示是完全可以的(和完全背包不同) 。

细节见代码:

#include<bits/stdc++.h>
using namespace std;
int n,d[35][10],Case = 0;
struct node{
    int v[5];
}a[35];
int dp(int i,int k) {
    int& ans = d[i][k];
    if(ans!=-1) return ans;
    ans = 0;
    for(int j=1;j<=n;j++) {
        if(k==0) { //不要被吓到。。这三部分只有很小的不同,复制就行了
            if((a[j].v[0]>a[i].v[1]&&a[j].v[1]>a[i].v[2])||(a[j].v[1]>a[i].v[1]&&a[j].v[0]>a[i].v[2]))
                ans = max(ans,dp(j,2)+a[j].v[2]);
            if((a[j].v[0]>a[i].v[1]&&a[j].v[2]>a[i].v[2])||(a[j].v[2]>a[i].v[1]&&a[j].v[0]>a[i].v[2]))
                ans = max(ans,dp(j,1)+a[j].v[1]);
            if((a[j].v[1]>a[i].v[1]&&a[j].v[2]>a[i].v[2])||(a[j].v[2]>a[i].v[1]&&a[j].v[1]>a[i].v[2]))
                ans = max(ans,dp(j,0)+a[j].v[0]);
        }
        else if(k==1) {
            if((a[j].v[0]>a[i].v[0]&&a[j].v[1]>a[i].v[2])||(a[j].v[1]>a[i].v[0]&&a[j].v[0]>a[i].v[2]))
                ans = max(ans,dp(j,2)+a[j].v[2]);
            if((a[j].v[0]>a[i].v[0]&&a[j].v[2]>a[i].v[2])||(a[j].v[2]>a[i].v[0]&&a[j].v[0]>a[i].v[2]))
                ans = max(ans,dp(j,1)+a[j].v[1]);
            if((a[j].v[1]>a[i].v[0]&&a[j].v[2]>a[i].v[2])||(a[j].v[2]>a[i].v[0]&&a[j].v[1]>a[i].v[2]))
                ans = max(ans,dp(j,0)+a[j].v[0]);
        }
        else {
            if((a[j].v[0]>a[i].v[0]&&a[j].v[1]>a[i].v[1])||(a[j].v[1]>a[i].v[0]&&a[j].v[0]>a[i].v[1]))
                ans = max(ans,dp(j,2)+a[j].v[2]);
            if((a[j].v[0]>a[i].v[0]&&a[j].v[2]>a[i].v[1])||(a[j].v[2]>a[i].v[0]&&a[j].v[0]>a[i].v[1]))
                ans = max(ans,dp(j,1)+a[j].v[1]);
            if((a[j].v[1]>a[i].v[0]&&a[j].v[2]>a[i].v[1])||(a[j].v[2]>a[i].v[0]&&a[j].v[1]>a[i].v[1]))
                ans = max(ans,dp(j,0)+a[j].v[0]);
        }
    }
    return ans;
}
int main() {
    while(~scanf("%d",&n)&&n) {
        for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i].v[0],&a[i].v[1],&a[i].v[2]);
        int ans = -1;
        for(int i=1;i<=n;i++) {
            for(int j=0;j<=2;j++) {
                memset(d,-1,sizeof(d));//每次都要清空,因为每一次的起点不同,导致结果大不一样
                ans = max(ans,dp(i,j)+a[i].v[j]);
            }
        }
        printf("Case %d: maximum height = %d\n",++Case,ans);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

BabylonJS娱乐场---基于WebGL的H5 3D游戏引擎

BabylonJS娱乐场! 一个保存的’定制的’ 娱乐场场景: http://babylonjs-playground.azurewebsites.net/#QKQHS它是什么?该BabylonJS...
  • AceWay
  • AceWay
  • 2016-04-29 11:31
  • 5496

BabylonJS文件格式---基于WebGL的H5 3D游戏引擎

Babylon.js 使用JSON文件格式来描述场景.你可以在这儿找到完整的加载器代码: https://github.com/BabylonJS/Babylon.js/blob/master/sr...
  • AceWay
  • AceWay
  • 2016-05-04 21:14
  • 3845

创建基础场景---基于WebGL的H5 3D游戏引擎BabylonJS

在本教程里, 我们将用Babylon.js创建一个基础的3D场景.具有两个造型物的基础场景在你开始之前,请确定你有个支持WebGL的浏览器 (比如:IE11+, 火狐4+, 谷歌浏览器9+, Oper...
  • AceWay
  • AceWay
  • 2016-05-08 21:19
  • 4417

uva 437 - The Tower of Babylon(DAG最长路)

本文出自 http://blog.csdn.

UVa437、POJ2241--The Tower of Babylon(巴比伦塔) DP

题目链接: http://poj.org/problem?id=2241 题目大意:给出n种木块,每种木块数量不限,要求选择一些搭成一座塔,使塔尽量高,求出最大值。规定:木块i能发在木块j上,仅当...

Codeforces 437E The Child and Polygon(区间DP)

<p style="margin-top: 0px; margin-bottom: 10px; line-h
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)