HDU 1069 Monkey and Banana 解题报告
基础dp题,开始我题目还看错了,以为每种立方体只能用1次。。。其实可以无限使用
解题思路:每种立方体可以摆成3种形式,全部做成结构,排个序,求最大高度就行
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#include<iomanip>
#pragma warning(disable:4996)
#define INF 0x3f3f3f3f
#define ll long long
#define PI acos(-1.0)
const int N = 1000010;
using namespace std;
struct block {
int x, y, z;
}a[100];//6个面分别做底,有6种情况,但是长宽可以比大小,这样只有3种了,石头数最大为30,所以开100个够用了
int dp[100];
bool cmp(block b1, block b2)//从小到大排序
{
if (b1.x == b2.x)//先比较长度,如果一样就比较宽度,小的排前面
return b1.y < b2.y;
return b1.x < b2.x;
}
int main()
{
int n, cnt = 0;
while (scanf("%d", &n) != EOF)
{
if (n == 0)
return 0;
cnt++;
int xx, yy, zz;
int c = 0;
for (int i = 0; i < n; i++)
{
scanf("%d%d%d", &xx, &yy, &zz);
a[c].z = xx;
a[c].x = yy > zz ? yy : zz;
a[c].y = yy > zz ? zz : yy;
c++;
a[c].z = yy;
a[c].x = xx > zz ? xx : zz;
a[c].y = xx > zz ? zz : xx;
c++;
a[c].z = zz;
a[c].x = yy > xx ? yy : xx;
a[c].y = yy > xx ? xx : yy;
c++;
}
sort(a, a + c, cmp);
int maxx = 0;
dp[0] = a[0].z;//注意初始化
for (int i = 1; i < c; i++)
{
maxx = 0;
for (int j = 0; j < i; j++)
{
if(a[j].x<a[i].x&& a[j].y< a[i].y)//如果当前j位置满足条件,就比较maxx和dp[j]的大小,dp[j]代表到j位置时的高度最大值,在循环中,maxx不停更新
maxx = maxx > dp[j] ? maxx : dp[j];
}
dp[i] = a[i].z + maxx;
}
int ans=0;
for (int i = 0; i < c; i++)//循环一次找出最大值
{
ans = max(dp[i], ans);
}
printf("Case %d: maximum height = %d\n", cnt, ans);
}
}
来源:CSDN
作者:人见人弯加奈美
链接:https://blog.csdn.net/weixin_45566331/article/details/103974169