蓝桥杯 子2023
问题描述
小蓝在黑板上连续写下从 1 到 2023 之间所有的整数,得到了一个数字序列:
S = 12345678910111213...20222023
小蓝想知道:S 中有多少种子序列恰好等于 2023?
子序列的说明
子序列可以从原始序列中按原顺序选出若干字符,但不要求连续。
以下是满足条件的 3 种子序列示例(用中括号 []
标出选中的字符):
1[2]34567891[0]111[2]1[3]14151617181920212223...
1[2]34567891[0]111[2]131415161718192021222[3]...
1[2]34567891[0]111213141516171819[2]021222[3]...
以下是不满足条件的示例(虽然包含了 2、0、2、3,但顺序不对):
1[2]345678910111[2]131415161718192[0]21222[3]...
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。
- 本题的结果是一个整数
- 在提交答案时只填写这个整数
- 填写多余内容将无法得分
c++代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string father, son;
vector<ll> last, now;
int main() {
father += "#";
for (ll i = 1; i <= 2023; i++) {
father += to_string(i);
}
son = "#2023";
//dp[i][j] = dp[i - 1][j] + (arr[i] == arr[j] ? dp[i - 1][j - 1]:0)
ll n = father.size() - 1, m = son.size() - 1;
last = vector<ll>(m + 1, 0), now = vector<ll>(m + 1, 0);
last[0] = 1;
for (ll i = 1; i <= n; i++) {
for (ll j = 1; j <= m; j++) {
now[j] += last[j];
if (father[i] == son[j]) now[j] += last[j - 1];
}
last = now;
now = vector<ll>(n + 1, 0);
last[0] = 1;
}
cout << last[m];
return 0;
}//by wqs