题意:给出一个递增的序列 a a ,求一个最长的子序列使得序列中的每个数都不大于前一个数的两倍。
思路:
刚开始以为要像求最长上升子序列的二分解法一样求,然后发现根本不用这样子做。
由于原序列是递增的,所以当
ai
a
i
大于
2∗ai–1
2
∗
a
i
−
1
时,
ai
a
i
也一定大于
ai–2
a
i
−
2
,
ai–3
a
i
−
3
……
所以每个数
ai
a
i
只会由前一个数
ai–1
a
i
−
1
转移得到。
这样就可以很容易的写出转移方程了:
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf (1<<30)
#define maxn 50
int n,k;
char a[maxn+5];
void read(int& x) {
scanf("%d",&x);
}
int main() {
read(n);read(k);
scanf("%s",a+1);
int len=0;
for(int i=1;i<n;i++) {
for(int j=1;j<=i;j++) {
if(a[j]!=a[n-i+j]) goto END;
}
len=i;
END:;
}
for(int i=1;i<k;i++) {
for(int j=1;j<=n-len;j++) printf("%c",a[j]);
}
printf("%s",a+1);
return 0;
}