本题总分:5 分
【问题描述】
小蓝在黑板上连续写下从 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]…
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得
#include<iostream>
#include <vector>
using namespace std;
string s1;
long long dp[6985][4];
string gets(int i)
{
string s2 = "";
while (i)
{
s2 += i % 10 + '0';
i /= 10;
}
string temp = "";
for (int i = s2.length()-1; i >=0; i--)
{
temp += s2[i];
}
return temp;
}
int main()
{
for (int i1 = 1; i1 <= 2023; i1++)
{
s1 += gets(i1);
}
for (int i = 1; i < s1.length(); i++)
{
if (s1[i] == '2')
{
dp[i][0] = dp[i - 1][0] + 1;
dp[i][2] = dp[i - 1][2] + dp[i - 1][1];
dp[i][1] = dp[i - 1][1];
dp[i][3] = dp[i - 1][3];
}
else if (s1[i] == '0')
{
dp[i][1] = dp[i - 1][0] + dp[i-1][1];
dp[i][0] = dp[i - 1][0];
dp[i][2] = dp[i - 1][2];
dp[i][3] = dp[i - 1][3];
}
else if (s1[i] == '3')
{
dp[i][3] = dp[i - 1][3] + dp[i-1][2];
dp[i][0] = dp[i - 1][0];
dp[i][1] = dp[i - 1][1];
dp[i][2] = dp[i - 1][2];
}
else
{
dp[i][0] = dp[i - 1][0];
dp[i][1] = dp[i - 1][1];
dp[i][2] = dp[i - 1][2];
dp[i][3] = dp[i - 1][3];
}
}
cout << dp[s1.length() - 1][3] << endl;;
}