日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ - 3311- Hie with the Pie ( 状压dp )

發(fā)布時間:2024/1/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ - 3311- Hie with the Pie ( 状压dp ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:點擊進入

題目


題意

從 0 出發(fā)經(jīng)過所有點最后再回到 0 點的最短距離( 可以多次經(jīng)過同一個點 )

思路

dp [ i ] [ j ] 代表經(jīng)過狀態(tài) i 里的點最后到 j 點經(jīng)過的距離
首先用 floyd 求每兩個點間的最短距離,然后從 0 -( 1<<n ) 枚舉每個狀態(tài),更新dp值
如果這個狀態(tài)只經(jīng)過 j 這個點,那么 dp [ i ] [ j ] = dis [ 0 ] [ j ];(一開始就是從 0 出發(fā))
如果經(jīng)過了多個點,可以通過枚舉中間點,來更新 dp 值( 類似 floyd )

代碼

// #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") //#pragma GCC optimize(3)//O3 //#pragma GCC optimize(2)//O2 //#include<bits/stdc++.h> #include<iostream> #include<string> #include<map> #include<set> //#include<unordered_map> #include<queue> #include<cstdio> #include<vector> #include<cstring> #include<algorithm> #include<iomanip> #include<cmath> #include<bitset> #include<fstream> #define X first #define Y second #define best 131 #define INF 0x3f3f3f3f3f3f3f3f #define pii pair<int,int> #define lowbit(x) x & -x #define inf 0x3f3f3f3f #define max(a,b) a>b?a:b #define min(a,b) a<b?a:b //#define int long long //#define double long double //#ifndef ONLINE_JUDGE freopen("data.in.txt","r",stdin); //freopen("data.out.txt","w",stdout); #endif //???t?áè? using namespace std; typedef long long ll; typedef unsigned long long ull; const double pai=acos(-1.0); const int Mod=998244353; const double eps=1e-9; const int N=26; const int mod=1e8; const int maxn=1e6+10;/*--------------------------------------------*/ inline int read() {int data=0,w=1; char ch=0;while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();if(ch=='-') w=-1,ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data*w; } /*--------------------------------------------*/int n,m,dis[12][12]; int dp[1<<12][12]; int main() { // ios::sync_with_stdio(false); // cin.tie(0);cout.tie(0);while(cin>>n){if(n==0) break;for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)cin>>dis[i][j];for(int k=0;k<=n;k++)for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)if(dis[i][j]>dis[i][k]+dis[k][j])dis[i][j]=dis[i][k]+dis[k][j];for(int i=0;i<(1<<n);i++)for(int j=1;j<=n;j++)dp[i][j]=inf;for(int i=0;i<(1<<n);i++){for(int j=1;j<=n;j++){if(i&(1<<(j-1)))//如果經(jīng)過這個城市{if(i==(1<<(j-1))) dp[i][j]=dis[0][j];else{for(int k=1;k<=n;k++)if(i&(1<<(k-1))&&j!=k)dp[i][j]=min(dp[i][j],dp[i^(1<<(j-1))][k]+dis[k][j]);}}}}int ans=inf;for(int i=1;i<=n;i++)ans=min(ans,dp[(1<<n)-1][i]+dis[i][0]);cout<<ans<<endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的POJ - 3311- Hie with the Pie ( 状压dp )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。