분할 codeforces 766 C. 마흐무드와 메시지 DP 문자열

제목 링크 : HTTPS : //codeforces.com/contest/766/problem/C
제목 효과 : n 개의 소문자 문자열의 길이를 가지는 문자의 문자열을 주어진. 각각의 해당 값은 문자열의 길이를 통해 나타나지 아이 아이의 요구 값에 해당하는 문자의 원래 문자열을 분할, 소문자 인공 지능 있습니다. 분할이 얼마나 적어도 분할 배의 방법으로 후 Q. 분할 얼마나 많은 방법으로, 가장 긴 문자열의 길이가 나타납니다 부문의 최소 수는 얼마입니까?

사고 : F [I] : i 번째 문자의 마지막 프로그램의 분할 수. P [I] : 문자열 번호의 마지막으로, i 번째 문자 분할 방식의 최대 수.

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int mod=1e9+7;
 
int s[35]={0};
char a[1005];
LL f[1005]={0};
LL p[1005]={0};
int c[1005][27]={0};
int main()
{
    int n, M1=1;
    scanf("%d", &n);
    scanf("%s", a+1);
    for(int i=1; i<=26; i++){
        scanf("%d", &s[i]);
    }
    f[0]=1,f[1]=1, p[1]=1, c[1][a[1]-'a'+1]++;
    for(int i=2; i<=n; i++){
            p[i]=1<<30;
        for(int j=1; j<=26; j++){
            c[i][j]+=c[i-1][j];
        }
        c[i][a[i]-'a'+1]++;
        for(int j=1; j<=i; j++){
            int g=0, Len=i-j+1;
            for(int k=1; k<=26; k++){
                if(c[i][k]-c[j-1][k]){
                    if(s[k]<Len){
                        g=1;
                    }
                }
            }
            if(!g){
                f[i]=(f[i]+f[j-1])%mod;
                M1=max(M1, Len);
                p[i]=min(p[i], p[j-1]+1);
 
                //cout<<i<<" "<<j<<" "<<f[i]<<endl;
            }
        }
    }
    printf("%lld\n%d\n%d\n", f[n], M1, p[n]);
 
    return 0;
}
게시 된 374 개 원래 기사 · 원 찬양 22 ·은 20000 +를 볼

추천

출처blog.csdn.net/qq_21433411/article/details/103215896