標籤: acm
題目:
給你乙個n*n的格仔的棋盤,每個格仔裡面有乙個非負數。input從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。
包括多個測試例項,每個測試例項包括乙個整數n 和n*n個非負數(n<=20)output
對於每個測試例項,輸出可能取得的最大的和sample input
3sample output 需要用到異或,感覺在狀態壓縮裡面特別重要75 15 21
75 15 28
34 70 5
按位與運算將兩個運算分量的對應位按位遵照以下規則進行計算:
0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。
即同為 1 的位,結果為 1,否則結果為 0。
例如,設3的內部表示為011
5的內部表示為101
則3&5
的結果為001
按位或運算將兩個運算分量的對應位按位遵照以下規則進行計算:
0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1
即只要有1個是1的位,結果為1,否則為0。
按位異或運算將兩個運算分量的對應位按位遵照以下規則進行計算:
0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
即相應位的值相同的,結果為 0,不相同的結果為 1。
例如,013^035
結果為026
。
異或運算的意思是求兩個運算分量相應位值是否相異,相異的為1,相同的為0。按位異或運算的典型用法是求乙個位串資訊的某幾位資訊的反。如欲求整型變數j的最右4位資訊的反,用邏輯異或運算017^j,就能求得j最右4位的資訊的反,即原來為1的位,結果是0,原來為0的位,結果是1。
#include
#include
#define m 17720 //每一行有最大17711種狀態
#define n 21
using
namespace
std;
intmap[n][n]; //儲存輸入的數字
int sum[n][m]; //第i行第j種狀態的總和
int state[m];
int dp[n][m];
int n,p;
int max(int a,int b) // 求最大值
bool checkline(int i) //檢查該狀態是否符合題意
bool checktwoline(int i,int j) //檢查該行與上一行是否符合題意
void init()
void solve()
int ans=dp[n-1][0];
for(i=1;iif(ans1][i])
ans=dp[n-1][i];
}cout
return
0;}
方格取數 1 (狀態dp)
給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 output 對於每個測試例項,輸出可能取得...
HDU 1565 方格取數 1 狀態壓縮)
沒什麼好說的,主要看 注釋,取數,某個位置能放東西,某個位置不能放等等,這類寫法基本都是這樣 problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最...
hdu2167 方格取數 狀態壓縮dp
題意 方格取數,八個方向的限制。思路 八個方向的不能用最大流了,四個的可以,八個的不能抽象成二分圖,所以目測只能用dp來跑,dp i j 表示的是第i行j狀態的最優,具體看 include include int dp 16 1 15 int map 16 16 int zt 1 15 int ma...