码迷,mamicode.com
首页 > 其他好文 > 详细

gym-101343B-So You Think You Can Count?

时间:2017-07-21 00:04:17      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:规划   动态规划   表示   name   ++   计算   nbsp   out   log   

 

 1 /*
 2 把一个字符串分成若干段,每一段里面的字符不能重复,问有多少种分法
 3 动态规划,定义dp 表示字符串前n个字母的分法种数,先预处理字符串,对于每个字符,
 4 计算出以这个字符为结尾的无重复字符的一段最长的长度,第i个字符对应的长度记为f[i]
 5 然后可以得出递推式:
 6 dp[0]=1;
 7 dp[i]=dp(i-j) (1<=j<=f[i])
 8 */
 9 #include <bits/stdc++.h>
10 using namespace std;
11 int dp[10005];
12 int f[10005];
13 bool vis[10];
14 const int mod=1e9+7;
15 int main()
16 {
17     string s;
18     int n;
19     cin>>n>>s;
20     memset(dp,0,sizeof(dp));
21     memset(f,0,sizeof(f));
22     for(int i=0;i<n;i++)
23     {
24         memset(vis,0,sizeof(vis));
25         int cnt=0;
26         for(int j=i;j>=0;j--)
27         {
28             if(vis[s[j]-0])
29                 break;
30             cnt++;
31             vis[s[j]-0]=1;
32         }
33         f[i+1]=cnt;
34     }
35     dp[0]=1;
36     for(int i=1;i<=n;i++)
37     {
38         int sum=0;
39         for(int j=1;j<=f[i];j++)
40         {
41             sum=(sum+dp[i-j])%mod;
42         }
43         dp[i]=sum;
44     }
45     cout<<dp[n]%mod<<endl;
46 }

 

gym-101343B-So You Think You Can Count?

标签:规划   动态规划   表示   name   ++   计算   nbsp   out   log   

原文地址:http://www.cnblogs.com/kearon/p/7214814.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!