状压dp Most Powerful

来源:互联网 发布:怎么爬外卖商家数据 编辑:程序博客网 时间:2024/05/22 01:31

题目地址

题目大意:有N个原子,下面输入w[N][N]矩阵   i 行 j 列任意两个原子碰撞产生的能量,j消失,求产生的最大的能量

思路:dp[1<<N]表示状态i时的最大能量,dp[i]=dp[i-1<<j]+w[k][j];0<=k<N

这算是一个比较简单状压dp题,只有1维,状态转移方程也很简单,也是在老师给的课件上的原题、

代码:

#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<queue>#include<stack>using namespace std;int N,a[15][15],dp[1<<12];int main(){    int i,j,k,ans;    while(~scanf("%d",&N))    {        memset(dp,0,sizeof(dp));        if(N==0) break;        for(i=1;i<=N;i++)            for(j=1;j<=N;j++)            scanf("%d",&a[i][j]);            ans=1<<(N+1);            for(i=0;i<ans;i++)            {                for(j=1;j<=N;j++)                {                    int s=1<<j;                    if(i&s) continue;                    for(k=1;k<=N;k++)                    {                        if((i&1<<k)==0&&k!=j)                        dp[i+s]=max(dp[i+s],dp[i]+a[k][j]);                    }                }            }            int aa=0;            for(i=0;i<ans;i++)            {                aa=max(aa,dp[i]);}            cout<<aa<<endl;    }}