动态规划训练之七

心已入冬 提交于 2019-11-30 20:56:13

状压模板题,不多述,复习一下而已

code:

#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> using namespace std; const int maxn=20; int map[maxn][maxn],num,n,ans,nums; int f[maxn][1<<18];   void dp(){     memset(f,0x3f,sizeof(f));     for(int i=1;i<=n;i++)f[i][1<<(i-1)]=map[0][i];     nums=(1<<n)-1;     for(int i=0;i<=nums;i++)//枚举所有可能的状态;         for(int j=1;j<=n;j++)             if(i&(1<<(j-1))) //枚举当前状态下到了第j个结点                  for(int k=1;k<=n;k++) {//从j之k,找出到k的最优值。                    if((i&(1<<(k-1)))==0) //如果第k结点还到,那么到达k,并更新其值。                     f[k][i|(1<<(k-1))] =min(f[k][i|(1<<(k-1))],f[j][i]+map[j][k]);                 }     ans=1<<20;     for(int i=1;i<=n;i++)         ans=min(ans,f[i][nums]+map[i][0]);     cout<<ans<<endl; } int main(){     freopen("in.txt","r",stdin);     freopen("out.txt","w",stdout);     cin>>n;     n--;     for(int i=0;i<=n;i++)         for(int j=0;j<=n;j++)             cin>>map[i][j];         dp();                        return 0;    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!