在乙個有 m*n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。
輸入格式:
第 1 行有 2 個正整數 m 和 n,分別表示棋盤的行數和列數。接下來的 m 行,每行有 n 個正整數,表示棋盤方格中的數。
輸出格式:
程式執行結束時,將取數的最大總和輸出
輸入樣例
3 3輸出樣例1 2 3
3 2 3
2 3 1
11m,n<=100
***********************怕不是要dp********************
這道題如果不是在網路流24題中,我可能真把它當dp了。
用最大流最小割定理求出至少需要不取多少數才能把剩下的數分開。
#include#includeview code#include
#include
#include
#include
#include
#include
#define ll long long
#define maxk 110
#define maxm 200010
#define maxn 20010
using
namespace
std;
ll n,m,a[maxk][maxk],sum;
ll v[maxm],fir[maxn],fl[maxm],nxt[maxm],cnt;
ll ss,tt,dis[maxn],vis[maxn],maxflow,inf[5];
ll read()
void
addedge(ll u1,ll v1,ll fl1)
ll bfs()}}
vis[u]=0
; }
return dis[tt]==-1?0:1;}
ll dfs(ll u,ll nowflow)
}return
sum;
}void
add(ll x,ll y)
else
}int
main()
}/*for(ll i=0;i<=tt;i++)
cout
return0;
}
聽說網路流可以解決絕大部分問題(就是時間複雜度……),你信嗎?
並不對勁的splay
splay和不加任何旋轉一定會被卡的二叉搜尋樹的唯一區別就是每次操作把當前節點旋轉到根。旋轉有各種zig zag的組合方式,感覺很麻煩,並不對勁的人並不想講。其實可以找出一些共性將它們合併。設ls a 點a是其父親的左兒子 son a 0 a的左兒子,son a 1 a的右兒子,fa a a的父親。...
並不對勁的費用流
最小費用最大流肯定要保證最大流,所以它和最大流有一些類似的性質。如果把費用看成邊,就可以每次走最短路 保證費用最小 走到不能走為止 保證最大流 費用流版的ek就是這樣。需要注意的是,反向弧的邊權為它對應的正向弧的費用的相反數,所以最短路要用spfa來求。費用流版的dinic,又叫zkw費用流,還是多...
並不對勁的字尾陣列
字尾陣列sa x 表示排序後第x位在排序前的位置。這個東西的求法有兩種,一種是倍增,時間複雜度o n log n 或o n log2n 另一種是用不知道什麼方法做到的o n 至於第二種方法是什麼,並不對勁的人並不知道,所以只說倍增。考慮正常地比較兩個字串,都是從頭比較到尾 那麼,如果把兩個字串都斷成...