給定若干個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 ...