HDU 1069 Monkey and Banana(최대 증가 하위 문자열)

4110 단어 dp
제목 링크: [kuangbin 너를 데리고 날아가] 주제 12 기본 DP1 C - Monkey and Banana

제목의 뜻


주어진 상자의 종류 수량 n, 그리고 대응하는 길이와 너비, 각 상자의 수량은 무한하며, 접을 수 있는 최대 높이는 얼마인지(위 상자의 길이와 너비는 아래 상자보다 엄격히 작다)

사고의 방향


상자마다 세 가지 방치 방식이 있고 수량이 무한하기 때문에 상자마다 세 개의 상자로 볼 수 있다.모든 상자를 주 길이와 부 너비에 따라 선대후소 순서를 정하면 문제는 최대 점증자열을 구하는 것이다.n의 범위가 매우 작기 때문에 30만 있기 때문에 직접 이중 순환 dp로 하면 된다

코드

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;

const int N = 39;
struct Node
{
    int a, b, c;
    bool operator < (const Node &t) const
    {
        if(a == t.a)
            return b > t.b;
        return a > t.a;
    }
}node[N*3];
int dp[N*3];

void add(int i, int a, int b, int c)
{
    node[i].a = a;
    node[i].b = b;
    node[i].c = c;
}

int main()
{
    int n, T = 1;
    while(~scanf("%d", &n) && n)
    {
        for(int i=0; i<n; i++)
        {
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            add(i*3, max(a, b), min(a, b), c);
            add(i*3+1, max(a, c), min(a, c), b);
            add(i*3+2, max(c, b), min(c, b), a);
        }
        sort(node, node+n*3);
        dp[0] = node[0].c;
        int ans = dp[0];
        for(int i=1; i<3*n; i++)
        {
            int temp = 0;
            dp[i] = node[i].c;
            for(int j=0; j<i; j++)
            {
                if(node[i].a<node[j].a && node[i].b<node[j].b)
                    temp = max(temp, dp[j]);
            }
            dp[i] += temp;
            ans = max(ans, dp[i]);
        }
        printf("Case %d: maximum height = %d
"
, T++, ans); } return 0; }

좋은 웹페이지 즐겨찾기