记录一个菜逼的成长。。
题目链接
题目大意:
给你n长度的字符串,以及26个数,表示’a’-‘z’所在字符串的最大长度
问满足条件的字符串集合划分数,以及最大的子串长度,最小的集合数
dp[0][i] := 表示前i个字符的子串划分数
dp[1][i] := 表示前i个字符的划分里最大的字串长度
dp[2][i] := 表示前i个字符的划分里最小的集合数
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int maxn = 1000 + 10;
int lt[30],dp[3][2000];
char str[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;cin>>n>>str;
for( int i = 0; i < 26; i++ )
cin>>lt[i];
dp[0][0] = 1;
for( int i = 1; str[i-1]; i++ ){
int len = INF;
dp[1][i] = -INF;
dp[2][i] = INF;
//从后往前枚举起点,[j,i)为一个集合
for( int j = i-1; j >= 0; j-- ){
len = min(len,lt[str[j]-'a']);
if(len < i-j)break;
dp[0][i] = (dp[0][i]+dp[0][j]) % MOD;
dp[1][i] = max(dp[1][i],max(dp[1][j],i-j));
dp[2][i] = min(dp[2][i],dp[2][j]+1);
}
}
cout<<dp[0][n]<<endl<<dp[1][n]<<endl<<dp[2][n]<<endl;
return 0;
}