给你一个小写字符串str和26个整数a[i],是用来限制(字母i所在的字符串不能超过a[i])
输出分割字符串的方案数。
输出所有方案中,最少的分割次数。
输出所有方案中,最大的子串长度。
dp[i][0] 表示前i个字母正确分割的数量
dp[i][1] 表示前i个字母正确分割且数量最少
dp[i][1] 表示前i个字母正确分割且最大子串的长度最大
dp[i][0] = dp[i][1] + dp[j - 1][0]
dp[i][1] = min(dp[i][1], dp[j - 1] + 1)
dp[i][2] = max(dp[i][2], max(i - j + 1, dp[j - 1][2]))
其中j为(1<= j <= i 且是正确的分割长度)
#include <bits/stdc++.h> using namespace std; const int maxn = 1005; const int mod = 1e9 + 7; const int inf = 1e9; //0:能够正确分割额数量 //1:能够正确分割次数最少额数量 //2:能够正确分割字符串最长的数量 int dp[maxn][3]; int a[maxn]; char str[maxn]; int main() { int n; cin >> n; cin >> str + 1; for (int i = 0; i < 26; i++) { cin >> a[i]; } for (int i = 0; i <= n; i++) { dp[i][0] = 0; dp[i][1] = inf; dp[i][2] = 0; } dp[0][0] = 1; dp[0][1] = 0; dp[0][2] = 0; for (int i = 1; i <= n; i++) { int limit=a[str[i]-'a']; for (int j = i; j >= 1; j--) { limit=min(limit,a[str[j]-'a']); if(i - j + 1 > limit) { break; } dp[i][0] = (dp[i][0] + dp[j - 1][0]) % mod; dp[i][1] = min(dp[i][1], dp[j - 1][1] + 1); dp[i][2] = max(dp[i][2], max(i - j + 1, dp[j - 1][2])); } } cout << dp[n][0] << endl; cout << dp[n][2] << endl; cout << dp[n][1] << endl; return 0; }