zoukankan      html  css  js  c++  java
  • luogu P5414 [YNOI2019]排序 |动态规划

    题目描述

    对于一个数列{7, 1, 2, 3}进行排序,我们可以把7 从头移动到尾。但是这个操作的成本是7,并不是最佳的。最佳的排序方式是将连续的1、2、3 移动到7 的前面。这样的话,总的操作成本就是1+2+3=6,比之前的成本7 要小。

    你的任务是,对于一个给定的数列,输出对这个数列进行排序的最小成本。

    输入格式

    输入文件名为sort.in。

    每个输入文件包含多组数据。

    输入文件的第一行,包含一个正整数T,代表该输入文件中所含的数据组数。

    接下来是T组数据,每组数据的格式如下:

    每组数据包含2 行;

    第一行包含一个正整数n,代表数列中元素的个数,其中0 < n ≤ 102;

    第二行包含n个整数,两个数之间以一个空格隔开,代表数列中的元素ki,其中−107-10^{7}−107 ≤ ki ≤ 10710^{7}107。

    输出格式

    输出文件名为sort.out。

    输出文件包含T行,分别对应T组数据的答案,即对数列进行排序的最小成本。

    说明/提示

    对于60%的数据:0 < n ≤ 60,−107-10^{7}−107 ≤ ki ≤ 10710^{7}107

    对于80%的数据:0 < n ≤ 80, −107-10^{7}−107 ≤ ki ≤ 10710^{7}107

    对于100%的数据:0 < n ≤ 102,−107-10^{7}−107 ≤ ki ≤ 10710^{7}10


    这道题就是移动几个数字使得数列单调上升,每次移动可以移动到任意位置,花费就是移动数字的大小。

    看到这个题之后,我们可以得到 得不到的洗洗睡吧 :最优解不可能把同一个数字移动2次及以上。既然我们可以一次把它移到正确的位置上,那么这个数字就可以理解为直接被移走了。

    那么问题就变成了:删除几个数字,使得数列单调递增,所求的是移走数字的最小和。 使得删除的和最小,就意味着留下的和最大。

    那么问题就变成了:保留几个单调递增的数字,使得和最大。

    #include<map>
    #include<ctime>
    #include<cstdlib>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    inline int read(){
    	int x=0; char c=getchar();
    	while(c<'0'||c>'9')c=getchar();
    	while('0'<=c&&c<='9'){ x=(x<<3)+(x<<1)+(c^48); c=getchar();}
    	return x;
    }
    const int N=205;
    int a[N],dp[N];
    signed main(){
    	register int i,j; int n;
    	for(int T=read(),sum=0,ans=0;T;T--,sum=0,ans=0){
    		n=read(); for(i=1;i<=n;i++){
    			a[i]=read(),sum+=a[i];
    			for(j=1;j<i;j++)if(a[j]<=a[i]&&dp[i]<dp[j])dp[i]=dp[j];
    			dp[i]+=a[i];
    		}
    		for(i=1;i<=n;i++)ans=max(ans,dp[i]);
    		printf("%d
    ",sum-ans);
    	}
    }
    
  • 相关阅读:
    Leetcode-2 两数相加
    离散数学-基本割集的找法
    Linux操作系统分析课程学习总结报告
    Linux实验三 结合中断上下文切换和进程上下文切换分析Linux内核一般执行过程
    Linux实验二:深入理解系统调用
    初始python
    水仙花数讲解
    Python-运算
    Python-列表
    Python-字符串
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/12013785.html
Copyright © 2011-2022 走看看