P2167 [SDOI2009] Bill的挑战 ( 状压dp

#include 
#define int_max 0x3f3f3f3f;
#define long_max 9223372036854775807;
using namespace std;
using VI = vector;
typedef long long ll;
typedef pair PII;
typedef pair PDD;
typedef unsigned long long ull;
const int mod = 1000003;
string s[20];
//盲猜一手,线性dp和状压dp的结合
//? 是万能的,
//match 表示第i位 字母j 的匹配情况 哪几个字符串匹配
//dp[lem][st]   当前长度下状态st 的匹配个数

int count_1(int x){
    int res = 0 ;
    while(x){
        res += x & 1;
        x = x>>1;
    }
    return res;
}



void solve(){
    int n,k;
    cin>>n>>k;
    for(int i=0;i>s[i];
    }
    int len = s[0].length();
    vector>match(len+2);
    vector>dp(len+2);
    for(int i=0;i>t;
    while(t--){
        solve();
    }

}

没想到用刷表法过了,弱

先考虑维护每个位置的字母配对情况,match[i][j]  用二进制数字表示哪几个串能匹配

考虑一个状态 st,他能走向的下一个状态是 st 和 match[i+1][j] 的交集

 如st = 011  match = 110  可以走向  010 

你可能感兴趣的:(dp,算法)