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

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

CF713C Sonya and Problem Wihtout a Legend &amp; hihocoder1942 单调序列

这两个题是一样的,不过数据范围不同. 思路1: 在CF713C中,首先考虑使生成序列单调不下降的情况如何求解.因为单调上升的情况可以通过预处理将a[i]减去i转化成单调不下降的情况. 首先,生成的序列中的每个数一定是原序列中的数.于是可以通过dp+离散化技巧解决.dp[i][j]表示把前i个数变成单调不下降的序列,并且a[i]不超过第j大的数所需要的最小代价. 实现1: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef lo

把一个序列转换成非严格递增序列的最小花费 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.

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

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

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

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

利用BioPerl将DNA序列翻译成蛋白序列

转自 https://www.plob.org/article/4603.html 具体请去上面的网页查看. my $DNA="ATGCCCGGT";my $pep=&TranslateDNASeq($DNA); sub TranslateDNASeq{    use Bio::Seq;    (my $dna)[email protected]_;    my $seqobj=Bio::Seq->new(-seq =>$dna, -alphabet =>'d

将给定序列翻译成蛋白质序列

利用 dictionary 可以将给定的cDNA序列翻译成蛋白序列 1 #!/bin/python 2 # Dictionary protein translation 3 4 my_dna = open("/home/maque/my_dna.txt").read().replace('\n', '') # 利用 str.replace() method 将 '\n' 去掉,这样 my_dna 就是一条单一的字符串 5 6 condon_table = {"TTT"

把一个类(或者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

java把汉字转换成拼音

汉字转换成拼音工具类: 1 import net.sourceforge.pinyin4j.PinyinHelper; 2 import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; 3 import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; 4 import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;

浮点数转换成字符串函数

sprintf函数太大,在STM8上面根本不敢用,动不动就.text overflow.为了将采集的数值通过串口上传到计算机,只能自己写了一个浮点数转换成字符串的函数: #include <stdio.h> #include <stdint.h> static char table[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; void num2char(char *str, double number, uint8_t