最长非递减子序列(动态规划)
作者:互联网
题目:https://ac.nowcoder.com/acm/contest/11211/A
白菜的基因序列由一串大写英文字母构成,dddd经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高,于是优秀的dddd开始着手修改白菜的基因序列,dddd每次修改基因序列的任意位需要的代价是1,dddd想知道,修改白菜的基因序列使其高附加值达到最高,所需要的最小代价的是多少。
输入描述:
第一行一个正整数n(1≤n≤1000000)
第二行一个长度为n的字符串,表示所给白菜的基因序列
保证给出字符串中有且仅有大写英文字母
输出描述:
输出一行,表示最小代价
示例1
输入
5
ACEBF
输出
1
说明
改成ACEEF或者ACEFF,都只用改动一个字符,所需代价最小为1
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char s[1001000];
int f[100];
int main(){
int n,i,j,a=0,b,c;
scanf("%d",&n);
scanf("%s",s);
for(i=0;i<n;i++){
b=s[i]-'A';
c=f[b];
for(j=0;j<b;j++)
f[b]=max(f[b],f[j]+1);
f[b]=max(f[b],c+1);
a=max(a,f[b]);
}
printf("%d",n-a);
return 0;
}
/*
判断前方有多少个小于当前字符的字符的个数
再+1,即为最长非递减子序列
*/
变形题:
题目:https://ac.nowcoder.com/acm/contest/11211/C
白菜的基因序列由一串大写英文字母构成,dddd经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高,于是优秀的dddd开始着手修改白菜的基因序列,dddd每次可以选择基因序列的一位进行修改,每次当她把一个字母xx修改成yy时,会产生|x-y|∣x−y∣(即xx与yy的ASCIIASCII码差值的绝对值)的改动偏移量,dddd希望,修改白菜的基因序列使其高附加值达到最高,并且基因序列的改动偏移量总和最小,她想知道最小的改动偏移量总和是多少。
输入描述:
第一行一个正整数n(1≤n≤1000000)
第二行一个长度为n的字符串,表示所给白菜的基因序列
保证给出字符串中有且仅有大写英文字母
输出描述:
输出一行,表示最小改动偏移量总和
示例1
输入
复制
5
AEEBC
输出
复制
5
说明
改成AEEEE或ACCCC偏移量总和最小
改成AEEEE,偏移量总和为|B-E|+|C-E|=3+2=5
改成ACCCC,偏移量总和为|E-C|+|E-C|+|B-C|=2+2+1=5
所以最小偏移量总和为5
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
char s[1001000];
int f[1001000][30];
int main(){
int n,i,j,a=inf,b,c;
scanf("%d",&n);
scanf("%s",s+1);
for(i=1;i<=n;i++){
b=s[i]-'A';
c=inf;
for(j=0;j<26;j++){
c=min(c,f[i-1][j]);
f[i][j]=c+abs(b-j);
}
}
for(i=0;i<26;i++)
a=min(a,f[n][i]);
printf("%d",a);
return 0;
}
/*
f[i][j]存储前i个字符改变为(j+'A')时的偏移量
i 1--n,依次(最优)累加
j 1--25,每次以上一次的小于当前的最优解(最小偏移量)
为基,再加上本次偏移量
*/
标签:include,白菜,基因,偏移量,dddd,序列,递减,最长 来源: https://blog.csdn.net/nearal/article/details/117379154