P1278 單詞遊戲

2021-09-26 10:58:42 字數 1244 閱讀 3986

題目描述

io和ao在玩乙個單詞遊戲。

他們輪流說出乙個僅包含母音字母的單詞,並且後乙個單詞的第乙個字母必須與前乙個單詞的最後乙個字母一致。

遊戲可以從任何乙個單詞開始。

任何單詞禁止說兩遍 ,遊戲中只能使用給定詞典中含有的單詞。

遊戲的複雜度定義為遊戲中所使用的單詞長度總和。

編寫程式,求出使用一本給定的詞典來玩這個遊戲所能達到的遊戲最大可能複雜度。

輸入格式 輸入檔案的第一行,表示乙個自然數n(1≤n≤16),n表示一本字典中包含的單詞數量以下的每一行包含字典中的乙個單詞,每乙個單詞是由字母a、e、i、o和u組成的乙個字串,每個單詞的長度將小於等於100,所有的單詞是不一樣的。

輸出格式 輸出檔案僅有一行,表示該遊戲的最大可能複雜度。

輸入輸出樣例

輸入:

5ioo

iuuo

aioiooi

aooi

輸出:

16一開始我用的爆搜,然後就沒過qwq,然後我就想著可以用clock()卡一下時間看看能不能過,但沒想的是竟然過了(大概資料太水了吧)下面是我寫的**爆搜的**(後面有更加高效的方法)

#include#include#include#include#includeusing namespace std;

int n;

int head[27][20]=;//head[i][j]i開頭的有誰 還有數量

int s[20][3];//記錄各單詞的首字母和尾字母

char f[120];//輸入

int h[25]=;//記錄誰被用了

int coun[27]=;//記錄各首字母的已被使用數量

int score[20];

int maxsum=0,maxn=0;

void dfc(int i,int sum)

}}int main()

p[20];

int s[20][1<<16]=;//儲存將各單詞作為開頭的所能達到最大長度

char f[102];//用於輸入/

int n;

int dfs(int x,int state)

}return s[x][state]+p[x].len;

}int main()

for(int i=0;icout

}

P1278 單詞遊戲

來自倉鼠老師的話 這題實際上就是帶權有向圖上點不重複的最長路徑。從理論上來說,應該是個np問題。就是把每一句話設為乙個點,然後可以 o n 2 的連邊,怎麼連邊就不說了吧。設dp i j 為當前走到 i 點,已走的狀態為 j 然後就可以愉快地進行狀壓dp。有乙個經驗性總結 列舉狀態的那一維一定要放在...

P1278 單詞遊戲

一道比較基礎的狀壓題,看到題解很多人都打的記搜,小蒟蒻來發個狀壓dp。由於不能多次使用同乙個單詞,對於每個單詞只有0 不選 1 選 兩種情況,並且n只有16顯然是狀壓了。對於每個單詞我們只關心首尾和長度,所以就記下每個單詞的首尾和長度。這題最簡單的點就是狀態很好設 f i j i為二進位制串表示用了...

洛谷P1278 單詞遊戲

io和ao在玩乙個單詞遊戲。他們輪流說出乙個僅包含母音字母的單詞,並且後乙個單詞的第乙個字母必須與前乙個單詞的最後乙個字母一致。遊戲可以從任何乙個單詞開始。任何單詞禁止說兩遍,遊戲中只能使用給定詞典中含有的單詞。遊戲的複雜度定義為遊戲中所使用的單詞長度總和。編寫程式,求出使用一本給定的詞典來玩這個遊...