codeforces

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <bitset>
 6 #include <vector>
 7 #include <queue>
 8 #include <stack>
 9 #include <cmath>
10 #include <list>
11 #include <set>
12 #include <map>
13 #define rep(i,a,b) for(int i = a;i <= b;++ i)
14 #define per(i,a,b) for(int i = a;i >= b;-- i)
15 #define mem(a,b) memset((a),(b),sizeof((a)))
16 #define FIN freopen("in.txt","r",stdin)
17 #define FOUT freopen("out.txt","w",stdout)
18 #define IO ios_base::sync_with_stdio(0),cin.tie(0)
19 #define mid ((l+r)>>1)
20 #define ls (id<<1)
21 #define rs ((id<<1)|1)
22 #define N 1005
23 #define INF 0x3f3f3f3f
24 #define INFF ((1LL<<62)-1)
25 using namespace std;
26 typedef long long LL;
27 typedef pair<int, int> PIR;
28 const int mod = 1e9+7;
29 
30 int n, x, lim[30], dp[N], dp1[N];
31 string s;
32 
33 bool judge(int l, int r){
34     int len = r-l;
35     rep(i, l, r){
36         if(lim[s[i-1]-'a'] <= len)    return false;
37     }
38     return true;
39 }
40 int main()
41 {IO;
42     //FIN;
43     while(cin >> n){
44         cin >> s;
45         rep(i, 0, 25)    { cin >> x; lim[i] = x; }
46 
47         mem(dp, 0);
48         mem(dp1, INF);
49         dp1[0] = 0;
50         dp[0] = 1;
51         int maxn = 0, minn = n;
52         rep(i, 1, n){
53             rep(j, 1, i){
54                 if(judge(j, i)){
55                     dp[i] = (dp[i]%mod+dp[j-1]%mod)%mod;
56                     dp1[i] = min(dp1[i], dp1[j-1]+1);
57                     if(dp[j-1])
58                         maxn = max(maxn, i-j+1);
59                 }
60             }
61         }
62         cout << dp[n] << "
" << maxn << "
" << dp1[n] << endl;
63     }
64     return 0;
65 }
View Code
原文地址:https://www.cnblogs.com/NWUACM/p/6595237.html