问题描述
小蓝在黑板上连续写下从1到2023之间所有的整数,得到了一个数字序列:S = 12345678910111213...20222023。小蓝想知道S中有多少种子序列恰好等于2023?
以下是3种满足条件的子序列(用中括号标识出的数字是子序列包含的数字):
- 1[2]34567891[0]111[2]1[3]141516718192021223...
- 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]...
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路:
常见的dp思路,记录子序列出现的次数
代码如下:
#include <iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
ll dp[5];
int main()
{
string s;
for(ll i = 1 ; i <= 2023 ; i++)
{
s += to_string(i);
}
for(ll i = 0 ; i < s.size() ; i++)
{
if(s[i] == '2')
{
dp[1]++;
dp[3] += dp[2];
}
if(s[i] == '0')
{
dp[2] += dp[1];
}
if(s[i] == '3')
{
dp[4] += dp[3];
}
}
cout << dp[4];
return 0;
}