zoukankan      html  css  js  c++  java
  • zoj3471_状压dp

    链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=50137#problem/C

    题意:有n种化学物质,他们彼此反应会有一种消失并释放出能量。

    给出矩阵,第i行j列代表i和j反应j消失释放的能量。

    求最大释放多少能量。

    思路:

    利用二进制0代表该物质还存在,1代表不存在。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 const int N = 1 << 10;
     7 int a[12][12], dp[N];
     8 int main()
     9 {
    10     int n;
    11     while(~scanf("%d", &n) && n)
    12     {
    13         for(int i = 1; i <= n; i++)
    14             for(int j = 1; j <= n; j++)
    15                 scanf("%d", &a[i][j]);
    16         memset(dp, 0, sizeof(dp));
    17         int mm = 0;
    18         for(int i = 0; i < (1 << n); i++)//利用二进制0代表该物质还存在,1代表不存在。
    19         {
    20             for(int j = 1; j <= n; j++)
    21             {
    22                 if(i & (1 << (j - 1)))//在剩下的物质里找没有发生反应的
    23                     continue;
    24                 for(int k = 1; k <= n; k++)
    25                 {
    26                     if(i & (1 << (k - 1)))
    27                         continue;
    28                     if(j == k)
    29                         continue;
    30                     int next = (i | (1 << (j - 1)));
    31                     dp[next] = max(dp[next], dp[i] + a[k][j]);
    32                     mm = max(dp[next], mm);
    33                 }
    34             }
    35         }
    36         printf("%d
    ", mm);
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    第六次作业--结对编程
    第四次作业--项目选题报告(团队)
    Eclipse和JDK的安装配置
    最大最小
    文档
    火车
    排队
    击鼓传花
    逆序数
    塔防——链表的基本操作
  • 原文地址:https://www.cnblogs.com/luomi/p/5670193.html
Copyright © 2011-2022 走看看