第一道狀態壓縮dp題,感覺要好好學習這種思維方式;
首先設l的位置為:pointx[0],pointy[0];其他節點的位置為:pointx[i],pointy[i];
然後求出各個節點之間的距離dis[i][j]=max;
我們用乙個n位2進製數(bn-1,...,b0)表示堅果收集情況的組合狀態;
其中bi=0表示第i+1個堅果沒有收集,bi-1表示第i+1個堅果收集了。
設堅果目前被收集的狀態為j,其中最後被收集的堅果為i,最小步數為f[i][j].
顯然初始化的時候:f[i][2的i-1次冪]=dis[0][i];
狀態i:按照遞增順利列舉狀態值
階段j:列舉狀態i中最後被收集的堅果j (i<=j<=n,i&2的j-1次冪!=0)
決策k:列舉狀態i外的堅果k(1<=k<=n,i&2的k-1次冪==0),
f[k][i+2的k-1次冪]=min( f[k][i+2的k-1次冪] , f[j][i]+dis[j][k] );
所以最後的結果為:
ans=min(f[i][2的n-1次冪]+dis[0][i]) (1<=i<=n);
下面是**,沒有給注釋,我的任務就是說一下思路,思路懂了,其他的都是小事。。。
#include#include#include#include#include#define inf 1<<22
using namespace std;
int x,y,num,ans,max;
char ch[22][22];
int dis[22][22];
int pointx[22],pointy[22];
int f[22][inf];
int abs(int a)
void init()
{ int i,j;
max=(1<
UVA 6625 狀態壓縮dp
這個題目的意思是給定k,n k,n 7 並給定k行每行有幾個連續的空格,所有的行左對齊,每一行最多7個,下面的行的空格數 上面相鄰行的空格數 給定乙個填數字的規則,當對於任意位置i,j num i j num i 1 j num i j num i j 1 問有 只用數字1 n 有多少種填滿空格的方...
uva11795 簡單狀態壓縮DP
一看到n 16就想到狀態壓縮dp了,而且只要儲存這個狀態就行了 轉移時也用狀態壓縮的轉移方法,比較兩個二進位制數,就能知道能否從已知狀態轉移到需要的狀態 開始沒看到題目給的就是二進位制數,自己還轉換成了二進位制 還有要記得用longlong 不能因為這個wa 還有位運算還不是很熟悉,可以用異或來去掉...
狀態壓縮DP
首先,我們以一道狀壓經典題tsp來引入。tsp問題 一張圖上有n個點,給定相應的鄰接矩陣,需要求出從0號節點出發,經過且只經過每個頂點一次,最後仍回到0號節點的最小邊權。思路 假設現在已訪問過的頂點集合 起點0當作還未訪問過的頂點 為s,當前所在頂點為v,用dp s v 表示從v出發訪問剩餘的所有頂...