當元素數量較小(不超過20)時,想要儲存每個元素取或不取,可以借助位運算壓縮狀態。空間複雜度為o(2
n)
o(2^n)
o(2n)。
蒜頭君喜歡中心對稱的字串,即回文字串。現在蒜頭君手裡有乙個字串 ss,蒜頭君每次都會進行這樣的操作:從 ss 中挑選乙個回文的子串行,將其從字串 ss 中去除,剩下的字元重組成新的字串 ss。
蒜頭君想知道,最少可以進行多少次操作,可以消除整個字串。
輸入格式
輸入一行。輸入乙個字串 ss(1≤length(s)≤16),字串均由小寫字母組成。
輸出格式
輸出一行,輸出乙個整數,表示消除整個字串需要的最少操作次數。
樣例輸入
abaccba
樣例輸出
2思路:
狀壓dp。每次都是刪去集合的子集,因此通過列舉子集來進行dp。用dp[
i]
dp[i]
dp[i
]表示子集i所需要的操作步驟數。
**:
問題描述#include
#include
#include
using
namespace std;
const
int inf=
0x3f3f3f3f
;string st;
//判斷是否回文串
intjudge
(int x)
st2=st1;
reverse
(st1.
begin()
,st1.
end())
;if(st1==st2)
return1;
return0;
}int dp[
70000];
intmain()
cout<<]
}
蒜頭君酷愛搭積木,他用積木搭了 n 輛重量為 wi的小車和一艘最大載重量為 w 的小船,他想用這艘小船將 n 輛小車運輸過河。每次小船運載的小車重量不能超過 w。另外,小船在運載小車時,每輛小車會對小船有乙個損壞值si,當多輛小車一起運載時,該趟運載對小船的損壞值為船上所有小車的最大損壞值。
現在蒜頭君想知道,如何用小船運載 n 輛小車,可以使得對小船造成的總損壞值最小。
輸入格式
第一行輸入兩個數 w 和 n(100≤w≤400,1≤n≤16),分別表示小船的最大載重量和小車總數。
接下來輸入 n 行,每行輸入兩個整數si和 wi(1≤si ≤50,10≤wi≤100),分別表示每輛小車對小船的損壞值和每輛小車的重量。
輸出格式
輸出一行,輸出乙個整數,表示用小船運載 nn 輛小車,最小的總損壞值。
樣例輸入
90 4
32 50
15 20
40 50
13 40
法二:#include
#include
#include
using
namespace std;
int w, n;
int w[16]
, s[16]
;//預先處理每一種子集情況的花費
intmaxs
(int n)
n >>=1;
if(weight > w)
}return ans;
}int
main()
int cnt =(1
<< n)-1
;int dp[cnt +1]
;memset
(dp,0,
sizeof
(dp));
//每個子集損壞值
for(
int i =
1; i <= cnt; i++
) dp[i]
=maxs
(i);
int res =
10000
;for
(int i =
1; i <= cnt; i++
) ans +
= dp[i]
; res =
min(res, ans);}
cout << res;
return0;
}
#include
#include
#include
int maxn=
0x3f3f3f3f
;using
namespace std;
intmain()
id++;}
if(ww > w)
//t這個狀態下,超過船的載重量了
continue;
dp[t]
= ss;
}for
(int t =
0; t <(1
<< n)
; t++)}
cout << dp[(1
<< n)-1
]<< endl;
return0;
}
狀態壓縮動態規劃
動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...
動態規劃 狀態壓縮
這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓的天井進行了一次大規模的裝修.原來的地板鋪有 n m 塊正方...
狀態壓縮動態規劃
我們可以使用乙個01串a來表示乙個集合。對於數x x 0 用ax 0表示它不在該集合中,用ax 1表示它在該集合中。將01串a看作是乙個二進位制數,我們把它轉換為十進位制,就可以使用乙個十進位制整數來表示乙個實際使用二進位制方式表示的集合。這樣,我們可以使用位運算方便地處理集合的操作。交集兩個集合a...