标签:for algo 示例 iostream str -o nbsp queue 继承
输入一个字符串,由数字构成,长度小于等于50
输出一个整数
132
3
9
1
333
7
123456
23
00
3
思路:
把字符串每个数字取模3 处理成 只有0 1 2三个字符的串。
二维数组dp[i] [j] 表示 前 i 个长度的所有子序列数位数字和取模 3 为 j 的数目( 0 <= j <= 2)
有状态转移方程 :dp[i] [j] = (dp[i - 1] [j] + dp[i - 1] [ (3 + j - m) % 3]) % 1000000007;
表示dp[i] [j]可以由两种情况递推过来:
1. 第 i 个数字不用, 直接继承 dp[i - 1] [j]。
2. 第 i 个数字与前边的一些数位和为 ( 3 + j - m) % 3 的所有子序列相接。
最后这个数字自己构成长度为 1 的子序列单独加上。
代码:
1 #include <cstdio> 2 #include <fstream> 3 #include <algorithm> 4 #include <cmath> 5 #include <deque> 6 #include <vector> 7 #include <queue> 8 #include <string> 9 #include <cstring> 10 #include <map> 11 #include <stack> 12 #include <set> 13 #include <sstream> 14 #include <iostream> 15 #define mod 1000000007 16 #define eps 1e-6 17 #define ll long long 18 #define INF 0x3f3f3f3f 19 using namespace std; 20 21 string str; 22 int dp[55][55]; 23 int main() 24 { 25 cin>>str; 26 dp[1][(str[0]-‘0‘)%3]=1; 27 int s=str.length(); 28 for(int i=2;i<=s;i++) 29 { 30 int x=(str[i-1]-‘0‘)%3; 31 for(int j=0;j<=2;j++) 32 { 33 dp[i][j]=(dp[i-1][j]+dp[i-1][(3+j-x)%3])%mod; 34 } 35 dp[i][x]=(dp[i][x]+1)%mod; 36 } 37 printf("%d\n",dp[s][0]%mod); 38 }
标签:for algo 示例 iostream str -o nbsp queue 继承
原文地址:https://www.cnblogs.com/mzchuan/p/11388153.html