욕심법+동태 기획

Monkey and Banana
너무 멋있어요. 예전에 어떻게 풀어야 할지 몰랐던 문제를 오늘 한 번에 제출하고 통과했어요.이것은 나의 노력에 대한 일종의 긍정이다.
이 문제는 욕심법에 동태적인 계획을 더해서 처음에는 길이와 넓이를 앞에 둔 다음에 가장 긴 상승자 서열을 구하는 방법으로 최대치를 구한다고 생각한다
벽돌 한 개를 무한히 쓸 수 있지만, 사실 너는 종류별로 최대 세 번을 쓸 수 있다는 것을 발견할 수 있다.그래서 나는 세 가지 상황을 모두 구조체에 넣고 순서를 정했다.
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define size 200

struct brick{ 
	int l, w, h;	// 、 、 
}bri[size];
int dp[size];
int index_bri;

int cmp(const brick &a, const brick &b){
	if(a.l == b.l){
		if(a.w == b.w)
			return a.h > b.h;	//        
		return a.w < b.w;		//        
	}
	return a.l < b.l;			//      
}

void init(int l, int w, int h){
	bri[index_bri].l = l;
	bri[index_bri].w = w;
	bri[index_bri++].h = h;	
}

int main()
{
	//freopen("in.txt", "r", stdin);
	int n, i, j, a, b, c, iCase = 0, max;
	while(cin>>n && n){
		index_bri = 0;
		max = 0;
		for(i = 0; i < n; i++){
			cin>>a>>b>>c;
			init(a, b, c);	//        
			init(a, c, b);
			init(b, a, c);
			init(b, c, a);
			init(c, a, b);
			init(c, b, a);
		}
		sort(bri, bri + index_bri, cmp);
		for(i = 0; i < index_bri; i++)
			dp[i] = bri[i].h;

		for(i = 1; i < index_bri; i++){
			for(j = 0; j < i; j++){
				if(bri[j].l < bri[i].l && bri[j].w < bri[i].w && dp[j] + bri[i].h > dp[i]){
					dp[i] = dp[j] + bri[i].h;
					if(dp[i] > max)
						max = dp[i];
				}
			}
		}
		cout<<"Case "<<++iCase<<": maximum height = "<<max<<endl;
	}
	return 0;
}

좋은 웹페이지 즐겨찾기