ZOJ 4257 (状态压缩dp)

来源:互联网 发布:十年前的qq网络用语 编辑:程序博客网 时间:2024/05/23 12:29

思路分析:状态压缩dp一般都是枚举状态,一层for循环,然后根据题目分别枚举元素,这题需要三层for循环

for(i)//枚举状态for(j)//枚举元素a//判断i状态是否有j        for(k)//枚举元素b        {        //a和b不能是同一元素        //判断i状态是否有k        }    }}
#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include<algorithm>using namespace std;int collide[11][11];int dp[1 << 11];int n;int main(){    while (cin >> n, n)    {        memset(dp, 0, sizeof(dp));        for (int i = 0; i<n; i++)        {            for (int j = 0; j<n; j++)            {                cin >> collide[i][j];            }        }        int end = 1 << n - 1;        for (int i = 0;i<=end; i++)        {            for (int j = 0; j<n; j++)            {                if ((i&(1 << j)))                    continue;                for (int k = 0; k<n; k++)                {                    if (j == k)                        continue;                    if ((i&(1 << k)))                        continue;                    int temp= i | (1 << k);                    dp[temp] = max(dp[temp], dp[i] + collide[j][k]);                }            }        }        int Max = 0;        for (int i = 0; i<(1 << n); i++)            Max = max(Max, dp[i]);        cout << Max << endl;    }    return 0;}
0 0
原创粉丝点击