专栏文章

题解:SP24999 SMILEY1807 - 1807

SP24999题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipa4sb5
此快照首次捕获于
2025/12/03 08:39
3 个月前
此快照最后确认于
2025/12/03 08:39
3 个月前
查看原文

翻译

在 smileyland 天使之国 SmileyLand。天使女王 Smiley1807 非常喜欢数字 18071807 ,因此她要求她的程序员的朋友写一个程序来找到最大的子序列的长度,其顺序是数字 11880077。例如,如果给定的序列是1800777700008888800077,那么满足上述条件的最大子序列之一是 1800000000777(或者 1888888000777),因此最大子序列的长度是 1313
输入输出格式
输入格式
输入只包含一个测试用例。测试用例只有一行,最长可达 10610^6。在输入序列中仅存在数字 11880077
输出格式:
输出只包含一行,包含最大子序列。

思路

开个数组,存数字 11880077 的先后顺序,然后……就是一个标准的最长不下降子序列问题了。
这个最长不下降子序列怎么做呢?
讲一个不一样的思路。
我们建一个数组存每种数的最后一个,这样就可以知道末尾为每种数的最长不下降子序列长度。每扫到一个数,到这个位置的最长不下降子序列长度就是末尾为应该在它之前出现数的最长不下降子序列长度加 11 和末尾为这个数的最长不下降子序列长度加 11 的最大值。

代码:

CPP
#include <bits/stdc++.h>
using namespace std;
int q[8],f[10000],z[8];
int main() {
	string xx;
	int x;
	cin>>xx;
	q[1]=1;q[8]=2;q[0]=3;q[7]=4;//先后顺序
	for(int i=0;i<=xx.size()-1;i++){
		x=q[xx[i]-'0'];
		f[i]=max(f[z[x]]+1,f[z[x-1]]+1);
		z[x]=i;
	}
	cout<<f[z[4]];
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...