通过观察,我们知道用暴力做法不容易得出答案,因此我们可以考虑动态规划,用一个dp[4]的数组,分别表示2023中前i个子串的数量,再遍历字符串,逐次更新dp数组,最后输出dp[3]即可
上代码
#include<iostream>
#include<string>
#include<algorithm>
#define int long long
using namespace std;
signed main(void)
{
string s1;
for (int i = 1; i <= 2023; i++) {
s1 += to_string(i);
}
int n = s1.size();//获取s1的长度
int dp[4];//dp[i]表示2023串中前i个串的方案数
for (int i = 0; i < 4; i++) dp[i] = 0;//初始化dp数组
for (int i = 0; i <= n; i++) {
if (s1[i] == '2') {
dp[0]++;
dp[2] += dp[1];//如果当前的字符为2,dp[0]肯定加1,再更新dp[2]
}
if (s1[i] == '0') {
dp[1] += dp[0];//如果当前字符为0,更新dp[1]表示当前有dp[1]个20串
}
if (s1[i] == '3') {
dp[3] += dp[2];//如果当前字符为3,更新dp[3]表示当前有dp[3]个2023串
}
}
cout << dp[3] << endl;
return 0;
}
最后答案如图