很简单,两个指针,指向1和n依次输出,然后自加自减即可。这样可以保证任意非两边的数同时大于或小于左邻和右邻的数。
看代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int i = 1, j = n;
while(i < j)
{
cout << j << ' ' << i << ' ';
i++, j--;
}
if(n & 1)
{
cout << i << endl;
}
else
cout << endl;
}
使用set,直接插入,然后输出即可
#include <iostream>
#include <set>
using namespace std;
set <int> s;
int main()
{
int n, m;
cin >> n >> m;
for(int i = 0; i < n + m; i++)
{
int a;
cin >> a;
s.insert(a);
}
for(auto it : s)
{
cout << it << ' ';
}
cout << endl;
}
动态规划
定义一个二维数组dp
dp[i[[j]表示在s[i…j]中最长回文子序列长度
状态转移方程是
如果s[i] == s[j],
dp[i][j] = dp[i+1][j-1] + 2;
否则
dp[i][j[ = max(dp[i+1][j], dp[i][j - 2]);
初始化
i == j时,dp[i][j] = 1;
i > j时,dp[i][j] = 0;
看代码
#include <iostream>
using namespace std;
const int N = 1e3 + 10;
int dp[N][N];
int main()
{
string s;
cin >> s;
int n = s.size();
for(int i = n - 1; i >= 0; i--)
{
dp[i][i] = 1;
for(int j = i + 1; j < n ; j++)
{
if(s[i] == s[j])
dp[i][j] = dp[i + 1][j - 1] + 2;
else
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
}
cout << dp[0][n - 1] << endl;
return 0;
}