FZU-2218 Simple String Problem(状态压缩DP)

 
题意:
给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积。
思路:
状态压缩DP最多16位,第i位的状态表示第i位字母是否存在,
代码:
#include<iostream>  
#include<algorithm>  
#include<cstdio>  
#include<queue>  
#include<map>  
#include<vector>  
#include<cstring>  
#include<cmath>  
#define eps 1e-12  
using namespace std;  
typedef long long ll;  
const ll mo = 1000000007, N = 2*1e3+10;  
char s[N];  
int dp[(1<<16)+100];  
int main()  
{  
    int t;  
    cin>>t;  
    while(t--)  
    {  
        int n, m;  
        scanf("%d%d", &n, &m);  
        scanf("%s", s);  
        memset(dp, 0, sizeof(dp));  
        for(int i = 0; i<n; i++)  
        {  
            int t = 0;  
            for(int j = i; j<n; j++)  
            {  
                t |= 1<<(s[j] - 'a');  
                dp[t] = max(dp[t], j - i + 1);  
            }  
        }  
        int s = 1<<m;  
        for(int i = 0; i<s; i++)  
        {  
            for(int j = 0; j<m; j++)  
            {  
                if((1<<j) & i)  
                    dp[i] = max(dp[i], dp[i^(1<<j)]);  
            }  
        }  
        int ans = 0;  
        for(int i = 0; i<s; i++)  
        {  
            ans = max(ans, dp[i]*dp[(s-1)^i]);  
        }  
        cout<<ans<<endl;  
    }  
    return 0;  
}  

  

原文地址:https://www.cnblogs.com/luowentao/p/8997048.html