hdu3657 奇偶方格取數

2021-08-06 07:42:57 字數 1991 閱讀 2194

從n*m的方格中取數 取走乙個數 你的總分數里就加上這個數 若取走乙個數之後 出現了兩個相鄰的格仔 那麼你的總分數里就要減去2*(x&y) x和y分別為這兩個格仔中原本放的數 同時規定了k個數必須要取走

方格取數的題做法:橫縱座標和為奇數的點為x集合放在左邊  為偶數的點為y集合放在右邊 

源點與集合x裡的點連邊 權值為點的權值    集合y裡的點與匯點連邊 權值為點的權值

然後x集合裡的點與相鄰的點(相鄰的點肯定是y集合裡的)連邊 邊的權值為2*(x&y)

(像hdu1569中 限制條件為所取數所在的2個格仔不能相鄰,那麼就讓相鄰的兩個格仔之間的邊的權值為inf,這樣對於s-u-v-t 不會去割u-v這條邊 而去割s-u和v-t中的至少一條)

首先用sum記錄點的總權值

我們來看一條邊的情況   即只有兩個格仔 n*m=1*2。矩陣為: 10  9 

0->2->1->3  0-2的權值為9   2-1的權值為16    1-3的權值為10   所以sum=9+10=19

這條邊的最小割為9 也就是要割掉0-2這條邊  割掉這條邊意味著什麼呢 意味著我們沒有選這條邊

所以結果為sum-最小割 ==19-9=10 這代表我們只拿出了10這個數字 並沒有拿出9 

那如果  0-2的權值為7   2-1的權值為2    1-3的權值為9    sum=9+7=16這種情況呢

顯然最小割為2 最終結果為sum-2=14

這意味這7和9這兩個數我們都拿出來了 但我們要為此付出代價 因為7與9相鄰 我們要付出2*(7^9)的代價

這樣模擬一下就比較好理解了

對於必須要取走的數 我們要把他們與源點或者匯點相連時邊的權值設為inf  這樣就永遠不會去割這條邊 看結果sum-最小割

這條邊永遠不會計算到最小割中 所以這個數肯定永遠都會保留在我們所要的答案sum-最小割 中

#include#include#include#include#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

const int maxn=2600;//jiedian de zui da zhi

const int maxm=880010;//bian de zui da zhi

const int inf=0x3f3f3f3f;

struct node

edge[maxm];

int tol;

int head[maxn];

int dep[maxn];

int gap[maxn];

void init() //remember write it in main function

void addedge(int u,int v,int w)

void bfs(int start,int end)

}}int sap(int start,int end,int n) //n shi jiedian de zui da ge shu ,including source and sink

for(i=0;idep[edge[i].to])

}--gap[dep[u]];

dep[u]=min+1;

++gap[dep[u]];

if(u!=start)u=edge[s[--top]].from;}}

return res;

}int a[55][55];

bool used[55][55];

int main()

}while(k--)

int source=0,sink=n*m+1;

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

else}}

int tt=sap(source,sink,sink+1);

printf("%d\n",sum-tt);

}return 0;

}

hdu 3657 最大點權獨立集)

思路我就不詳細講了,這位大牛講的很清楚 1 include2 include3 include4 define maxn 55 5 define maxm 55 55 6 define inf 1 30 7using namespace std 8struct edgeedge maxm 11 11...

HDU 1565 方格取數

第一道狀態壓縮dp,比較簡單,做得也比較暴力,不過還挺適合入門,貼個 紀念一下 include include include include include define pub push back define ll int64 using namespace std const int n 2...

動態規劃 方格取數(hdu1565)

題目描述 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大 解題思路 很顯然又是dp問題,我們可以把方格當成乙個矩陣,每個數都是取或不去狀態,這裡為了方便,我們以01來表示他們的取...