给你一个小写字符串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;
} 
京公网安备 11010502036488号