zoukankan      html  css  js  c++  java
  • 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;  
    }  
    

      

  • 相关阅读:
    函数中,易遗忘记载
    常用函数源码
    装饰器之自我理解
    函数名、闭包及迭代器
    函数2
    trap(陷井)
    文件操作
    搭建Pxe引导RamOS Linux内存系统
    X86服务器BMC基板管理控制器介绍
    Linux操作系统自动部署--镜像格式qcow2
  • 原文地址:https://www.cnblogs.com/luowentao/p/8997048.html
Copyright © 2011-2022 走看看