DP专题练习题2

数字排列

在这里插入图片描述

/*
先找规律,根据题目要求的前面的数字尽可能大,从第一位开始试数字,从20-1尝试,可以找到以下序列,并观察出规律
20 19 20 18 20 19 20 17 20 19 20 18 20 19 20 17 20 19 20 18
20 19 20
20 19 20 18 20 19 20
20 19 20 18 20 19 20 17 20 19 20 18 20 19 20
发现f[1] = 20,f[2] = f[1] + " " + f[21-2] + " " + f[1],f[3] = f[2] + " " + f[2]....
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N = 1e3 + 10,mod = 1e9 + 7;
vector<string> dp(20);
int n;
void solve(){
	cin >> n;
	dp[1] = "20";
	for(int i = 2 ; i <= 17 ; i ++)
		dp[i] = dp[i-1] + " " + to_string(21-i) + " "+ dp[i-1];
	string str;
	for(int i = 0 ,cnt = 0 ; i < dp[17].size() && cnt < n;i++){
		if(dp[17][i] != ' ') str +=dp[17][i];
		else {
			int num = stoi(str); cout << num << " ";
			str = "";
			cnt ++;
		}
	}
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int _ = 1;
	//cin >> _;
	while(_--) solve();
	return 0;
}
posted @ 2024-03-22 11:05  xde_yt  阅读(0)  评论(0编辑  收藏  举报  来源