一道比較基礎的狀壓題,看到題解很多人都打的記搜,小蒟蒻來發個狀壓dp。
由於不能多次使用同乙個單詞,對於每個單詞只有0(不選)1(選)兩種情況,並且n只有16顯然是狀壓了。
對於每個單詞我們只關心首尾和長度,所以就記下每個單詞的首尾和長度。
這題最簡單的點就是狀態很好設:f[i][j] i為二進位制串表示用了哪些單詞(基本的狀壓操作)j表示末尾是哪個單詞。
j,k為兩單詞,當t[j]與h[k]相同時,f[i|(1<<(k-1))][k]=max(f[i][j]+l[k],f[i|(1<<(k-1))][k]);
注意j一定是i狀態中選了的詞,k是沒選過的,以及億些位運算的細節比如卡了小蒟蒻1h的i|1<<(k-1)才是將i的從右往左第k位變成1。
#include#define ll long longusing
namespace
std;
int h[20],t[20],l[20],f[200000][20
],n,ans;
string s[20
];int
main()
for(int i=1;i<=(1
<1;i++)///
列舉狀態 }}
for(int i=1;i<=(1
<1;i++)
for(int j=1;j<=n;j++)
ans=max(ans,f[i][j]);
cout
}
雖然dp的效率比不過各種玄學優化的搜尋,但dp還是很穩定的。
P1278 單詞遊戲
題目描述 io和ao在玩乙個單詞遊戲。他們輪流說出乙個僅包含母音字母的單詞,並且後乙個單詞的第乙個字母必須與前乙個單詞的最後乙個字母一致。遊戲可以從任何乙個單詞開始。任何單詞禁止說兩遍 遊戲中只能使用給定詞典中含有的單詞。遊戲的複雜度定義為遊戲中所使用的單詞長度總和。編寫程式,求出使用一本給定的詞典...
P1278 單詞遊戲
來自倉鼠老師的話 這題實際上就是帶權有向圖上點不重複的最長路徑。從理論上來說,應該是個np問題。就是把每一句話設為乙個點,然後可以 o n 2 的連邊,怎麼連邊就不說了吧。設dp i j 為當前走到 i 點,已走的狀態為 j 然後就可以愉快地進行狀壓dp。有乙個經驗性總結 列舉狀態的那一維一定要放在...
洛谷P1278 單詞遊戲
io和ao在玩乙個單詞遊戲。他們輪流說出乙個僅包含母音字母的單詞,並且後乙個單詞的第乙個字母必須與前乙個單詞的最後乙個字母一致。遊戲可以從任何乙個單詞開始。任何單詞禁止說兩遍,遊戲中只能使用給定詞典中含有的單詞。遊戲的複雜度定義為遊戲中所使用的單詞長度總和。編寫程式,求出使用一本給定的詞典來玩這個遊...