1304D Shortest and Longest LIS

题意:
第一行输入T,有T组测试。
每组测试为一行,输入一个n 和长度为n-1的仅由< >组成的字符串,<代表左边的比数要比右边的数小,反之大。
输出:
第一行:用1~n结合符号构造一种最短的LIS(Longest Increasing Subsequence 最长上升子序列)并输出如何构造。
第二行:用1~n结合符号构造一种最长的LIS(Longest Increasing Subsequence 最长上升子序列)并输出如何构造。

思路:
贪心+模拟
贪心要使LIS最短即最前面的数越大越好,要使LIS最长即最前面的数越小越好,再结合符号满足题意的方案模拟并保存输出。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 +7;
const ll MAXN = 2e5 + 5;

int n,m,a[MAXN],b[MAXN];
string s;

void solve(){
	cin>>n>>s;
	m=n;
	for(int i=0;i<n;i++){
		int len=1;
		while(i<s.size() && s[i]=='<'){
			len++;
			i++;
		}
		for(int j=i;j>i-len;j--){
			a[j]=m;
			m--;
		}
	}
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	m=1;
	for(int i=0;i<n;i++){
		int len=1;
		while(i<s.size() && s[i]=='>'){
			len++;
			i++;
		}
		for(int j=i;j>i-len;j--){
			b[j]=m;
			m++;
		}
	} 
	for(int i=0;i<n;i++){
		cout<<b[i]<<" ";
	}
	cout<<endl;
}

int main(){
	int T;cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
发布了35 篇原创文章 · 获赞 4 · 访问量 4303

猜你喜欢

转载自blog.csdn.net/Meulsama/article/details/104367139