程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1565 方格取數(1)(狀壓dp)

HDU 1565 方格取數(1)(狀壓dp)

編輯:C++入門知識

HDU 1565 方格取數(1)(狀壓dp)


感覺這道題目的數據比較水啊,程序的時間復雜度為1711^2*20竟然也可以過掉。。。。其他的就是狀壓了啊,注意需要滾動一下啊。。。。

方格取數(1)

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5701 Accepted Submission(s): 2159


Problem Description 給你一個n*n的格子的棋盤,每個格子裡面有一個非負數。
從中取出若干個數,使得任意的兩個數所在的格子沒有公共邊,就是說所取的數所在的2個格子不能相鄰,並且取出的數的和最大。
Input 包括多個測試實例,每個測試實例包括一個整數n 和n*n個非負數(n<=20)
Output 對於每個測試實例,輸出可能取得的最大的和
Sample Input
3
75 15 21 
75 15 28 
34 70 5 

Sample Output
188

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


using namespace std;

const int maxn = 22;
int dp[2][1<<21];
int mp[maxn][maxn];
int num[1<<22];

int judge(int x)
{
    for(int i = 0; i < 20; i++) if((x&(1< 0) continue;
                    if(j&k) continue;
                    sum = max(sum, dp[0][k]);
                }
                dp[1][j] += sum;
            }
            for(int j = 0; j < pp && num[j] < (1<

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved