ZOJ1093 动态规划

给你n中砖块,有三维长宽高,每种无限取用,叠加的条件是上一块的长宽必须严格大于下一块的长宽,求叠加最高高度,

思路:

把每种砖块最终按照放置方法可以转为六种,然后对于长和宽进行排序,这样就是LIS的变向问题了

#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#include<cctype>

#define ll long long

#define LL __int64

#define eps 1e-8

#define inf 0xfffffff

//const LL INF = 1LL<<61;

using namespace std;

//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;

int box[500][3];
int dp[1000];

int cnt;

typedef struct Node {
	int x,y,z;
};

Node node[500];

void init() {
	memset(box,0,sizeof(box));
	memset(dp,0,sizeof(dp));
	cnt = 0;
}

/*void cal(int x,int y,int z) {
box[cnt][0] = x,box[cnt][1] = y,box[cnt++][2] = z;
box[cnt][0] = y,box[cnt][1] = x,box[cnt++][2] = z;
box[cnt][0] = y,box[cnt][1] = z,box[cnt++][2] = x;
box[cnt][0] = z,box[cnt][1] = y,box[cnt++][2] = x;
box[cnt][0] = x,box[cnt][1] = z,box[cnt++][2] = y;
box[cnt][0] = z,box[cnt][1] = x,box[cnt++][2] = y;
}*/

void cal(int x,int y,int z) {
	node[cnt].x = x,node[cnt].y = y,node[cnt++].z = z;
	node[cnt].x = y,node[cnt].y = x,node[cnt++].z = z;
	node[cnt].x = y,node[cnt].y = z,node[cnt++].z = x;
	node[cnt].x = z,node[cnt].y = y,node[cnt++].z = x;
	node[cnt].x = x,node[cnt].y = z,node[cnt++].z = y;
	node[cnt].x = z,node[cnt].y = x,node[cnt++].z = y;
}

bool cmp(Node x,Node y) {
	if(x.x == y.x) {
		if(x.y == y.y)return x.z < y.z;
		return x.y < y.y;
	}
	return x.x < y.x;
}

int main() {
	int n;
	int	Case = 0;
	while(scanf("%d",&n),n) {
		init();
		for(int i=0;i<n;i++) {
			int x,y,z;
			scanf("%d %d %d",&x,&y,&z);
			cal(x,y,z);
		}
		int ans = 0;
		sort(node,node+cnt,cmp);
		/*for(int i=0;i<cnt;i++) {
			printf("%d %d %d**\n",node[i].x,node[i].y,node[i].z);
		}*/
		for(int i=0;i<cnt;i++)
			dp[i] = node[i].z;
		for(int i=0;i<cnt;i++) {
			for(int j=1;j<i;j++) {
				int a = node[j].x;
				int b= node[i].x;
				int c = node[j].y;
				int d= node[i].y;
				if(node[j].x < node[i].x && node[j].y < node[i].y) {
					dp[i] = max(dp[j] + node[i].z,dp[i]);
				}
			}
			if(ans < dp[i])
				ans = dp[i];
		}
		printf("Case %d: maximum height = %d\n",++Case,ans);
	}
	return 0;
}

ZOJ1093 动态规划,布布扣,bubuko.com

时间: 2024-10-07 08:31:12

ZOJ1093 动态规划的相关文章

ZOJ1093 Monkey and Banana 【DP】

一.题目 ZOJ 1093 二.题目源程序 #include <stdio.h>//一个箱子有3种h..所以总共有3*n种高度.按面积从大到小排序 #include <stdlib.h> struct block { int x,y,z,h; }a[200]; int cmp(const void *a,const void *b)//快排,模版 { return ((struct block *)b)->x*((struct block *)b)->y - ((str

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define NofActivity 11 int c[NofActivity + 1][NofActivity + 1]; int reme[NofActivity + 1][NofActivity + 1]; //活动的

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s

[动态规划] 黑客的攻击 Hacker&#39;s CrackDown Uva 11825

抽象为数学模型就是,  取尽可能多的互不相交的子集 ,  使得每一个子集都能覆盖全集 #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int n; int P[1000],cover[1000],f[1000]; int main(){ scanf("%d", &n); for (int i = 0; i < n;i++) {

Beauty Of algorithms(七)动态规划 钢条分割 矩阵链乘 最长公共子序列 最优二叉树

1.动态规划                动态规划的方法与方法类似,英文"dynamic programming",这里的programming不是程序的意思,而是一种表格法.都是通过组合子问题的解来解决原问题,分治方法将划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来求出原问题的解.与之相反动态规划应用于子问题的重叠情况,即不同的子问题具有公共的子问题,子问题的求解是递归进行 的,将其划分为更小的子问题,动态规划,每个子问题只求解一次,将其保存在表格中,从而无需每次求

Hdoj 1176 免费馅饼 【动态规划】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26110    Accepted Submission(s): 8905 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

pat 1068 动态规划/Fina More Conis

1068. Find More Coins (30) Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special re