方格取數 1

2021-06-09 01:16:05 字數 1263 閱讀 1535

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 using namespace std;

#define node_max 500

#define inf 0x3f3f3f3f

#define min(a,b) (a)<(b)?(a):(b)

int node_num;

int tu[node_max][node_max];

int sap(int sta,int ed)

} if(m==inf)

m=node_num+2;

if(m==dist[now])

k=now;

while(k!=sta)

maxflow+=minn;

memset(path,0,sizeof(path));

now=sta;

}} else

}return maxflow;

}int gra[25][25],col[25][25];

int main()

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

else

tu[i*n+j+1][n*n+n+4] = gra[i][j];

}} node_num = n*n+4+n;

printf("%d\n",sum-sap(1,n*n+4+n));

} return 0;

}

M 方格取數 1

問題 就是n n的棋盤,充滿的是非負數。從中取出若干個數,是的任意兩個無公共邊,並且取得和最大 思路 1.預處理 先列舉一行中所符合要求的所有狀態,即兩兩不相鄰的。方法是列舉 0 1 2.特殊處理第一行的狀態,把第一行已知的值初始化 3.列舉後面的行,只要滿足相鄰兩行之間沒有相鄰的1,找到合法的狀態...

方格取數 1 (狀態dp)

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

狀壓dp 方格取數 1

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