uvalive3637(DP)
사고방식: (세 층이 있으면 두 층만 고려하면 되고 세 번째 층은 자동으로 확정된다) DP.책의 높이에 따라 큰 것부터 작은 것까지 순서를 정하다.예상하기 어려운 DP.dp[i][j]를 설정하면 2층 너비가 i 3층 너비가 j일 때의 최소 높이를 나타낸다.순서가 이미 큰 것에서 작은 것까지 정렬되었기 때문이다.그래서 책꽂이에 넣은 첫 번째 책은 틀림없이 이 층에서 가장 높은 것이다.그렇다면 이 책이 이 층의 첫 번째 책인지 아닌지를 판단하기만 하면 원래의 기초 위에서 높이를 더해야 한다. 그렇지 않으면 너비를 더한 후의 높이가 원래의 높이와 같다.
코드:
#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <algorithm>
const int maxn = 2500;
const int INF = 0x3f3f3f3f;
struct book {
int h,w;
}p[100];
int dp[maxn][maxn],n;
bool cmp(book a,book b) {
return a.h > b.h;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
int tot = 0;
for(int i = 0; i < n; i++) {
scanf("%d%d",&p[i].h,&p[i].w);
tot += p[i].w;
}
sort(p,p + n,cmp);
for(int i = 0; i <= tot; i++)
for(int j = 0; j <= tot; j++)
dp[i][j] = INF;
dp[0][0] = 0;
for(int k = 1; k < n; k++) {
for(int i = tot; i >= 0; i--) {
for(int j = tot; j >= 0; j--) {
if(dp[i][j] != INF) {
if(i == 0)
dp[i + p[k].w][j] = min(dp[i + p[k].w][j],dp[i][j] + p[k].h);
else
dp[i + p[k].w][j] = min(dp[i + p[k].w][j],dp[i][j]);
if(j == 0)
dp[i][j + p[k].w] = min(dp[i][j + p[k].w],dp[i][j] + p[k].h);
else
dp[i][j + p[k].w] = min(dp[i][j + p[k].w],dp[i][j]);
}
}
}
}
int ans = INF;
for(int i = 1; i <= tot; i++) {
for(int j = 1; j <= tot; j++) {
if(dp[i][j] != INF) {
int w = max(i,j);
w = max(w,tot - i - j);
ans = min(ans,(dp[i][j] + p[0].h) * w);
}
}
}
printf("%d
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.