書店管理員要把書架上的書整理一下,其實就是一排書,讓書的排序是按照書的高低,每本書有一個重量,重量越大,移動書時越費力,越累,讓我們求的是,總的移動書本的最小重量是多少。
給出的數據是:
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;
}