1. 程式人生 > >DAG上的動態規劃(紫書經典)

DAG上的動態規劃(紫書經典)

一、矩形巢狀問題 1.題目描述 2.程式碼實現

#include<iostream>
#include<algorithm>
#include<math.h>
#include<string>
#include<string.h>
#include<stdio.h>
#include<queue>
using namespace std;
//二級排序 動態規劃
//矩形巢狀
int dp[1005];//儲存前i位最大上升子序列長度
struct node
{
    int x;//長
    int y;//寬
} num[1005];
bool cmp(node a,node b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;//優先排列長度
}
int main()
{
    int N;
    scanf("%d",&N);
    while(N--)
    {
        int n;//矩形個數
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%d%d",&num[i].x,&num[i].y);
            if(num[i].y<num[i].x)
                swap(num[i].x,num[i].y);
            getchar();
        }
        sort(num,num+n,cmp);
        int max_sum=1;//最大數量
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(int i=1; i<n; i++)
        {
            dp[i]=1;
            for(int j=0; j<i; j++)
            {
                if(num[i].x>num[j].x&&num[i].y>num[j].y)
                    dp[i]=max(dp[i],dp[j]+1);
            }
            if(dp[i]>max_sum)
                max_sum=dp[i];
        }
        printf("%d\n",max_sum);
    }
    return 0;
}

二、硬幣問題