给你一个小写字符串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;
}