把一个序列转换成非严格递增序列的最小花费 POJ 3666

 1 //把一个序列转换成非严格递增序列的最小花费 POJ 3666
 2 //dp[i][j]:把第i个数转成第j小的数,最小花费
 3
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cstdlib>
 7 #include <algorithm>
 8 #include <vector>
 9 #include <math.h>
10 // #include <memory.h>
11 using namespace std;
12 #define LL long long
13 typedef pair<int,int> pii;
14 const int inf = 0x3f3f3f3f;
15 const LL MOD =100000000LL;
16 const int N = 3000+10;
17 const double eps = 1e-8;
18 void fre() {freopen("in.txt","r",stdin);}
19 void freout() {freopen("out.txt","w",stdout);}
20 inline int read() {int x=0,f=1;char ch=getchar();while(ch>‘9‘||ch<‘0‘) {if(ch==‘-‘) f=-1; ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘;ch=getchar();}return x*f;}
21
22 int a[N],b[N];
23 LL dp[N][N];
24 int main(){
25     int n;
26     scanf("%d",&n);
27     for(int i=1;i<=n;i++){
28         scanf("%d",&a[i]);
29         b[i]=a[i];
30     }
31     sort(b+1,b+1+n);
32     for(int i=1;i<=n;i++){
33         dp[1][i]=abs(a[1]-b[i]);
34     }
35     for(int i=2;i<=n;i++){
36         LL minn=1e18;
37         for(int j=1;j<=n;j++){
38            minn=min(minn,dp[i-1][j]);
39            dp[i][j]=minn+abs(a[i]-b[j]);
40         }
41     }
42     LL ans=1e18;
43     for(int i=1;i<=n;i++){
44         ans=min(ans,dp[n][i]);
45     }
46     cout<<ans<<endl;
47     return 0;
48 }
时间: 2024-08-25 02:55:39

把一个序列转换成非严格递增序列的最小花费 POJ 3666的相关文章

把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend

1 //把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend 2 //dp[i][j]:把第i个数转成第j小的数,最小花费 3 //此题与poj 3666相似 a[i]转换成a[i]-i 4 5 #include <iostream> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <algorithm> 9 #include <

递归如何转换成非递归

为什么要讲递归呢? 因为递归很复杂,需要很长时间,见识过很多例子,包括了解好多数据结构才能深刻体会到如何使用递归,有时候,我们也不知道是否可以使用还是不能使用递归,其实可以通过非递归思想去理解,然后通过递归算法来进行编程实现,都是一个很好的方向,递归的本质是栈. 递归一般使用栈和队列使用区别? 通过很多例子发现凡是使用深度优先都是使用递归算法,凡是使用层次遍历的使用的都是队列.这个让我们怎么理解,我个人发现一个小的情况就是,递归它一般都是有一定的关系的,如深度优先遍历,它都是一个结点和另外一个结

php遍历字符串每一个字符转换成数组。

php:遍历字符串每一个字符,追加给新数组. <?php /*    $str[$i]:字符串变量名+下标可以取值到对应下标的字符串的值.    explode(separator,string,limit)可以以固定字符为断点转换成数组    ru */ $str = "abcde";//被遍历的字符串 $arr = array();//定义要输出的数组 for($i=0;$i<strlen($str);$i++){//遍历字符串追加给数组 $arr[] = $str[$

3.4.4 利用栈将递归转换成非递归的方法

在函数执行时系统需要设立一个“递归工作栈”存储第一层递归所需的信息,此工作栈是递归函数执行的辅助空间,所以可以看出,递归程序在执行时需要系统提供隐式栈这种数据结构来实现,对于一般的递归过程,仿照递归算法执行过程中递归工作栈的状态变化可直接写出相应的非递归算法.这种利用栈消除递归过程的步骤如下. (1)设置一个工作栈存放递归工作记录(包括实参.返回地址及局部变量等) (2)进入非递归调用入口(即被调用程序开始处)将调用程序传来的实在参数和返回地址入栈(递归程序不可以作为主程序,因而可认为初始是被某

POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思路:比较简单的区间DP,令dp[i][j]表示使[i,j]回文的最小花费.则得到状态转移方程: dp[i][j]=min(dp[i][j],min(add[str[i]-'a'],del[str[i]-'a'])+dp[i+1][j]); dp[i][j]=min(dp[i][j],min(add[

求两个有序序列合并成新有序序列的中位数,求第k小数

此算法涉及一个重要数学结论:如果A[k/2-1]<B[k/2-1],那么A[0]~A[k/2-1]一定在第k小的数的序列当中,可以用反证法证明. 更加一般的结论是:k=pa+pb,如果A[pa-1]<B[pb-1],那么A[0]~A[pa-1]一定在第k小的数的序列当中. 算法思想如下: 1,假设A长度为m,B长度为n,m>n,反之亦然. 2,拆分k=pa+pb. 3,如果A[pa-1]<b[pb-1],那证明第A[0]~A[pa-1]一定在合并后k小数序列中.所以,可以把A的前面

Python3基础 list(enumerate()) 将一个列表的每一个元素转换成 带索引值的元组

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ code: numbers=[1,2,3,4,5,6] print(numbers) newNumbers=list(enumerate(numbers)) print(newNumbers) result: ============= RESTART: C:/Users/Administ

把一个类(或者Object)转换成字典

直接上代码:把一个类转换成object,然后在转换成字典 1 internal static IDictionary<string, string> GetDictionary(this object source) 2 { 3 if (source == null) 4 { 5 return new Dictionary<string, string>(); 6 } 7 PropertyDescriptorCollection properties = TypeDescripto

字符串转换成数字

<script type="text/javascript"> /* 字符串转数字 parseInt() 可以把一个字符串转换成整数. parseFloat() 可以把一个字符串转换成小数. */ var a = "12"; a = 12.64; a = "123abc123"; /* parseInt方法如果接收的字符串含有非数字的字符,那么parseInt方法会从字符串的首个字符开始寻找,一直找到非数字字符为止,然后就使用前面的数