没想到能想出来这个dp(蒟蒻的成就感,大佬勿喷),哈哈哈,记录一下~
问题描述
小蓝在黑板上连续写下从 11 到 20232023 之间所有的整数,得到了一个数字序列: S=12345678910111213...20222023S=12345678910111213...20222023。 小蓝想知道 SS 中有多少种子序列恰好等于 20232023?
以下是 33 种满足条件的子序列(用中括号标识出的数字是子序列包含的数字):
1[2]34567891[0]111[2]1[3]14151617181920212223...1[2]34567891[0]111[2]1[3]14151617181920212223...
1[2]34567891[0]111[2]131415161718192021222[3]...1[2]34567891[0]111[2]131415161718192021222[3]...
1[2]34567891[0]111213141516171819[2]021222[3]...1[2]34567891[0]111213141516171819[2]021222[3]...
注意以下是不满足条件的子序列,虽然包含了 22、00、22、33 四个数字,但是顺序不对:
1[2]345678910111[2]131415161718192[0]21222[3]...1[2]345678910111[2]131415161718192[0]21222[3]...
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'int dp[5];//1 2 3 4//1表示2的个数,2表示20的个数,3表示202的个数,4表示2023的个数signed main()
{for(int i=1;i<=2023;i++){vector<int> v;int x=i;while(x){v.push_back(x%10);x/=10;}reverse(v.begin(),v.end());for(int j=0;j<v.size();j++){if(v[j]==2){dp[1]++;dp[3]=dp[3]+dp[2];}else if(v[j]==0){dp[2]=dp[2]+dp[1];}else if(v[j]==3){dp[4]=dp[4]+dp[3];}}}cout<<dp[4]<<endl;return 0;
}
//计算2的个数,20的个数,202的个数,2023的个数
//
//