poj 3311 狀壓DP

來源:互聯網
上載者:User

標籤:style   blog   color   os   io   for   2014   代碼   

經典TSP變形


學到:1、floyd  O(n^3)處理任意兩點的最短路

    2、集合的位表示,我會在最後的總結出寫出。注意寫代碼之前一定設計好位的狀態,本題中,第0位到第n位分別代表第i個城市,1是已經走過,0沒走過

那麼DP方程  :dp[s][i]--當前在城市i,狀態為s(s儲存的是走過了那些城市)


            3、最後要求形成迴路,那麼就是min(dp[1<<(n+1)-1][i],dp[0][i])


#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <iostream>#include <cmath>#include <map>#include <queue>using namespace std;#define ls(rt) rt*2#define rs(rt) rt*2+1#define ll long long#define rep(i,s,e) for(int i=s;i<e;i++)#define repe(i,s,e) for(int i=s;i<=e;i++)#define CL(a,b) memset(a,b,sizeof(a))#define IN(s) freopen(s,"r",stdin)const int MAXN = 12;int dis[MAXN][MAXN];int dp[1<<MAXN][MAXN];const int INF = 1e9+10;int n;void floyd(){    rep(k,0,n+1)        rep(i,0,n+1)            rep(j,0,n+1)                dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);}int main(){    //IN("poj3311.txt");    int len;    while(~scanf("%d",&n) && n)    {        rep(i,0,n+1)            rep(j,0,n+1)                dp[i][j]=dis[i][j]=INF;        rep(i,0,n+1)            rep(j,0,n+1)            {                scanf("%d",&len);                dis[i][j]=min(dis[i][j],len);            }        floyd();//求出任意兩點的距離        int S=1<<(n+1);        rep(i,0,S)            rep(j,0,n+1)            {                    dp[i][j]=INF;            }        for(int s=0;s<S;s++)//枚舉所有的狀態            rep(i,0,n+1)            {                if(s&(1<<(i)))                    {                        if(s==(1<<i))dp[s][i]=dis[0][i];                        else                        rep(j,0,n+1)                            if(s&(1<<j) && i!=j)                            {                                dp[s][i]=min(dp[s^(1<<i)][j]+dis[j][i],dp[s][i]);                            }                    }            }        int ans=INF;        for(int i=0;i<n+1;i++)            ans=min(ans,dp[(S-1)][i]+dis[i][0]);        printf("%d\n",ans);    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.