9.2-整理書架-最大上升子序列

書店管理員要把書架上的書整理一下,其實就是一排書,讓書的排序是按照書的高低,每本書有一個重量,重量越大,移動書時越費力,越累,讓我們求的是,總的移動書本的最小重量是多少。

給出的數據是:

5(書的數量)

1 2 5 3 3 (表示書的高度)

1 1 3 1 1 (標示書的重量)

輸出是2,

爲什麼是2,因爲這裏只需要把第4,第5本書移動到第三本書的前面,就能夠保證書的有序,移動的重量和是2。

思路:求最小相當於求最大(不需要移動的最大數量)
然後最長上升子序列的變種

#include<iostream>
using namespace std;
int height[1000];
int weight[1000];
int n;
int dp[1000];
int sum=0;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>height[i];
    } 
    for(int i=1;i<=n;i++)
    {
        cin>>weight[i];
        dp[i]=weight[i];
        sum+=weight[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<i;j++)
        {
            if(height[j]<=height[i])
            {
                if(dp[j]+weight[i]>dp[i])
                {
                    dp[i]=dp[j]+weight[i];//與普通上升子序列的不同之處 
                }
            }
        }
    }
    int maxnum=0;
    for(int i=1;i<=n;i++)
    {
        maxnum=max(dp[i],maxnum);
    }
    cout<<sum-maxnum; 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章