M 方格取數 1

2021-08-13 07:40:40 字數 780 閱讀 4648

問題:就是n*n的棋盤,充滿的是非負數。從中取出若干個數,是的任意兩個無公共邊,並且取得和最大

思路:1.預處理:先列舉一行中所符合要求的所有狀態,即兩兩不相鄰的。方法是列舉(0——1<2.特殊處理第一行的狀態,把第一行已知的值初始化

3.列舉後面的行,只要滿足相鄰兩行之間沒有相鄰的1,找到合法的狀態,利用dp求出最大值即可

dp[i][j]表示前i行,第i行取第j個狀態時的取值總和,則dp[i][j] = max(dp[i][j], dp[i-1][k] + sum[i][j]).其中sum[i][j]表示第i行取第j個狀態的取值總和。

由於我scanf漏了~,一直tle。。。。

感受:::巧妙運用二進位制

**如下:

#include#include#include#includeusing namespace std;

int dp[25][20000];

int num[25][20000];

int sta[20000];

int map[21][21];

int n;

int count1;

void init()

return sum;

}int main()

}init();

for(int i=1;i<=count1;i++)

}//其實也是類似於預處理

for(int i=2;i<=n;i++)}}

int max=-1;

for(int i=1;i<=count1;i++)

cout<

方格取數 1

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...

方格取數 1 (狀態dp)

給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 output 對於每個測試例項,輸出可能取得...

狀壓dp 方格取數 1

題目位址 題目大意 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。思路 zh這個題是好久以前看過題解,當時感覺挺困難的,就沒做,這兩天才做的,對於現在來說也不算是難題了,不過是...