NC244325. 1919810
描述
输入描述
仅一行,包含一个字符串。
输出描述
仅一行,包含一个整数,表示字符串有多少个子序列的“增减性”同,结果对取模。
示例1
输入:
1919810
输出:
1
示例2
输入:
19198210
输出:
5
说明:
个子序列依次为、、、、C++(g++ 7.5.0) 解法, 执行用时: 96ms, 内存消耗: 2492K, 提交时间: 2022-11-22 22:47:40
#include<iostream> using namespace std; const int mod=1e9+7; int a[10][10]; int main() { string str; cin>>str; str=" "+str; for(int i=1;i<str.size();i++) { int t=str[i]-'0'; a[t][1]++; for(int j=7;j>=2;j--) { if(j==2||j==4) { for(int k=0;k<t;k++)a[t][j]=(a[t][j]+a[k][j-1])%mod; } else { for(int k=t+1;k<=9;k++)a[t][j]=(a[t][j]+a[k][j-1])%mod; } } } int ans=0; for(int i=0;i<=9;i++) ans=(ans+a[i][7])%mod;cout<<ans<<endl; return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 122ms, 内存消耗: 3504K, 提交时间: 2022-10-23 17:52:28
#include<bits/stdc++.h> using namespace std; #define int long long const int mod=1e9+7; int f[20][20]; signed main() { string s; cin>>s; int n=s.size(); s=" "+s; for(int i=1;i<=n;i++){ int t=s[i]-'0'; f[t][1]++; for(int j=7;j>=2;j--){ if(j==2||j==4){ for(int k=0;k<t;k++) f[t][j]=(f[t][j]+f[k][j-1])%mod; } else { for(int k=t+1;k<=9;k++) f[t][j]=(f[t][j]+f[k][j-1])%mod; } } } int ans=0; for(int i=0;i<=9;i++){ ans=(ans+f[i][7])%mod; } cout<<ans<<endl; return 0; }