從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來表示他們的取...