problem description
給你乙個n*n的格仔的棋盤,每個格仔裡面有乙個非負數。
從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。
input
包括多個測試例項,每個測試例項包括乙個整數n 和n*n個非負數(n<=20)
output
對於每個測試例項,輸出可能取得的最大的和
sample input
375 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這個題是好久以前看過題解,當時感覺挺困難的,就沒做,這兩天才做的,對於現在來說也不算是難題了,不過是...