本题总分: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 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;;