題目:
思路:最大流最小割:最大和=所有數之和—最小割(網路流)
建圖:奇數點連源點,然後以inf為容量連周圍偶數點,偶數點連匯點。
#include#include#include#include#include#include#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 50 + 5;
const int maxs = maxn*maxn + 5;
int n,m,source,sink;
int mp[maxn][maxn];
struct edge;
struct dicnic;
edge e2 = ;
edges.push_back(e1);
edges.push_back(e2);
int m = edges.size();
g[from].push_back(m-2);
g[to].push_back(m-1);
}void init(int n)
edges.clear();
}bool bfs()}}
return vis[t];
}int dfs(int x ,int a)
}return flow;
}int maxflow(int s,int t)
return flow;
}}g;int drx = ;
int dry = ;
bool valid(int x,int y)
int id(int x,int y)
int main()
}else
sum+=mp[i][j];
}int ans = g.maxflow(source,sink);
printf("%d\n",sum-ans);
}return 0;}/*
60 31 1231 12 1 21
13 135 1321 1 3 21
132 132 5 15 3 12
13 453 321 45 0 0
35 534 4 531 124 12
13 135 1321 1 3 21
*/
HDU 1565 方格取數
第一道狀態壓縮dp,比較簡單,做得也比較暴力,不過還挺適合入門,貼個 紀念一下 include include include include include define pub push back define ll int64 using namespace std const int n 2...
HDU1565方格取數
典型的狀態壓縮dp問題。第i行的取法只受到第i 1行的影響。首先每一行的取法要相容 不能有兩個相鄰 然後相鄰行之間也要相容。將每乙個格仔看做兩種狀態,1表示取,0表示不取。這樣每一行就是乙個01串,恰好可以看做是乙個二進位制數,那麼該二進位制數對應的十進位制整數可以唯一的表示為當前第 i 行的狀態。...
HDU 1565 方格取數 1
hdu 1565 方格取數 1 我的第乙個狀態壓縮dp 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數,從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大 3 75 15 21 75 15 28 34 70 5 188對於每乙個數...