問題:就是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這個題是好久以前看過題解,當時感覺挺困難的,就沒做,這兩天才做的,對於現在來說也不算是難題了,不過是...