有乙個n*m的矩陣上存在一些石頭,接下來要從起點出發把這些石頭拿上並回到起點,問最小需要多少步。
用sum表示除了(1,1)這個點外其他有石頭的點的個數,用x陣列和y陣列表示這些點的座標的位置,在這裡我用二進位制下的每個位置表示點的位置,將最後的位置來表示起點,0 - n-1分別表示其他點的位置,然後開始暴力列舉二進位制下的每個數字,注意初始化dp[0] [n]=0.
#include
using
namespace std;
int x[20]
,y[20];
int ma[60]
[60];
int dp[
1<<12]
[15];
intdis
(int i,
int j)
intmain()
} x[sum]=1
,y[sum]=1
; n=sum;
memset
(dp,
0x3f
,sizeof
(dp));
dp[0]
[n]=0;
for(
int st=
0;st<(1
<;st++)}
}printf
("%d\n"
,dp[(1
<][n]);
}}
給n個地點,然後輸入乙個(n+1)*(n+1)的矩陣,第i行第j列表示第i個地點到第j個地點的時間,要從第0個地點用最短的時間走遍1-n個地點,並回到原點。
先用floyd最短路徑演算法求出任意倆點之間的最短時間,接下來就是乙個tsp板子,記住最後再讓他回到原點就行了。
#include
#include
#include
using
namespace std ;
int d[20]
[20];
int dp[
1<<12]
[20];
intmain()
}for
(int k=
0;k<=n;k++
)for
(int i=
0;i<=n;i++
)for
(int j=
0;j<=n;j++
) d[i]
[j]=
min(d[i]
[j],d[i]
[k]+d[k]
[j])
;memset
(dp,
0x3f
,sizeof
(dp));
dp[1]
[0]=
0;n++
;for
(int i=
1;i<
1<)for
(int j=
0;j(i>>j&1)
for(
int k=
0;k((i^
1<>>k&1)
dp[i]
[j]=
min(dp[i]
[j],dp[i^
1<[k]+d[k]
[j])
;int ans=
0x3f3f3f3f
;for
(int i=
1;i) ans=
min(ans,dp[(1
<][i]
+d[i][0
]);printf
("%d\n"
,ans);}
}
有乙個n*n的地圖,.表示可行走的路,#表示障礙,接下來有m行,x1,y2,x2,y2分別表示隧道的入口和出口,最後求走完這些隧道並且只能走一次需要多長時間。
首先bfs所有隧道從入口到另乙個隧道出口的時間,如果不能到達將它置為-1,然後就是初始化從每個起點出發(也就是for(int i=0;i#include
#include
#include
#include
using
namespace std;
const
int inf =
0x3f3f3f3f
;struct pointp[17]
;int n,m;
char ma[17]
[17];
int mp[17]
[17],visit[17]
[17],dp[
1<<15]
[17];
int step[4]
[2]=
,,,}
;bool
check
(int x,
int y)
intbfs
(point x,point y)}}
return-1
;}intmain()
for(
int i=
0;ifor(
int i=
1;i<
1 int i= 0;i) dp[ 1<[i]=0; for( int i= 0;i< 1<)int ans= 0x3f3f3f3f ;for (int i= 0;i) ans= min(ans,dp[(1 <][i]); if(ans== 0x3f3f3f3f )printf ("-1\n"); else printf ("%d\n" ,ans);} return0; } dp過程中的狀態不可能像揹包問題一樣只有整數,肯定有各種各樣稀奇古怪的狀態,需要不止乙個變數來表示。這種情況下如果需要使用dp 就必須把狀態壓縮成乙個數來表示,並且乙個數只能對應於一種狀態。特別地,對於集合我們可以把每乙個元素的選取與否對應到乙個二進位制位裡,從而把狀態壓縮成乙個整數,大大方便了計算... 題意 裸的tsp。分析 用bfs求出任意兩點之間的距離後可以暴搜也可以用next permutation水,但效率肯定不如狀壓dp。dp s u 表示從0出發訪問過s集合中的點,目前在點u走過的最短路程。poj 2688 sep9 include include using namespace st... 用三個陣列來儲存他的每乙個狀態及 三個方向 利用行減列 得到以下數字 所以在同乙個主對角線上的 row i是相同的 只需要標記vis row i n 就知道在這主對角線時候已經有皇后了 n是為了防止負數 0 1 2 3 4 1 0 1 2 3 2 1 0 1 2 3 2 1 0 1 4 3 2 1 ...狀態壓縮DP與TSP問題
poj 2688 狀態壓縮dp解tsp
N皇后問題 狀態壓縮