其他分享
首页 > 其他分享> > 最长非递减子序列(动态规划)

最长非递减子序列(动态规划)

作者:互联网

题目: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