SCU 4501 DNA序列 (狀壓DP)

2021-07-11 17:47:52 字數 1718 閱讀 9529

給定若干個dna序列,求最短包含所有序列的長度

包含不一定是連續包含,可以不是子串

狀壓dp

依次構造每一位

把每個字串走到的位置標記一下,壓成6進製數

然後每個狀態拓展乙個字串

然後同時拓展其他所有下一位與其相同的串

然後把狀態丟到佇列裡轉移,當每個串都走到結尾時輸出答案

可以保證答案最多不超過40

時間複雜度 o(

ans∗

lenn

)

#pragma comment(linker, "/stack:102400000,102400000")

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef pair pii;

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef

double dbl;

typedef

long

double ldbl;

#define mst(a,b) memset(a,b,sizeof(a))

#define clr(a) mst(a,0)

#define sqr(a) (a*a)

struct data

};int n;

char inpt[10][10];

int tlen[10];

int buff[10];

int encode(int*);

int* decode(int);

bool check(int*);

int main()

queue

que;

set vis;

que.push(data(0,0));

while(que.size())

bool ban[10]=;

for(int i=0; iint temp[10];

if(used[i]>=tlen[i]||ban[i]) continue;

char nxt=inpt[i][used[i]];

for(int j=0; jif(temp[j]>=tlen[j]) continue;

if(inpt[j][temp[j]]==nxt)

}int nm=encode(temp);

if(vis.find(nm)!=vis.end()) continue;

que.push(data(nm, u.res+1));

vis.insert(nm);

}que.pop();

}while(que.size()) que.pop();

}return0;}

int encode(int buff)

int* decode(int num)

return buff;

}bool check(int cntc)

杭電4501 三維dp

這到題可以算乙個三維的揹包吧 之前把題義理解錯了 以為以0積分或0錢那的就算免費的 原來不是 可以拿任意價值的。看了別人的 也學到了一點小技巧,比如dp i j max dp i 1 j dp i 1 j c i 這不是這道題的轉移方程 如果用滾動陣列要注意內迴圈的順序,但不用滾動陣列會浪費空間 所...

SCU 1118 上車人數

問題描述 公共汽車從始發站 稱為第1站 開出,在始發站上車的人數為a,然後到達第2站,在第2站有人上 下車,但上 下車的人數相同,因此在第2站開出時 即在到達第3站之前 車上的人數保持為a人。從第3站起 包括第3站 上 下車的人數有一定的規律 上車的人數都是前兩站上車人數之和,而下車人數等於上一站上...

HDU 4501 小明系列故事 買年貨

解題思路 三維揹包,設定dp i j k 代表有i塊錢,有j個積分和k個免費物品的時候,可以得到的最大價值。則對於當前物品,我有兩種選擇 第一種 不買 第二種 買 如果選擇買又分了三種情況,1.用錢買。dp i 錢 j k 價值 2.用積分買。dp i j 積分 k 價值 3.免費拿。dp i j ...