problemstring problem (hdu5772)
題目大意
給定一個由數字組成的字串(n<=100),挑選出一些字元組成一個新的字串。
字串的價值: sigma w[id(i)][id(j))] (i !=j) id(i)為某字元在原串中的位置,w為給定矩陣。
字串的代價: 設x為數字i出現的次數,則代價為a[i]*(x-1)+b[i] (x>0) 0 (x=0)
要求最大化價值-代價。
題目分析
比較難想到的最大權閉合圖模型。
昨天剛補完一道,今天又沒想出來~~
搬運官方題解:
參考程式
1 #include 2 #include 3 #include 4 #include 5view codeusing
namespace
std;67
#define inf 2000000000
8#define v 6000
9#define e 100000
10int
n,m,ans,dis[v],s,t;
1112
struct
lineeg[e];
15int lt[v],sum=1;16
17void adt(int u,int v,int
c)20
21void add(int u,int v,int
c)25
26void
init()
3031
bool
bfs()45}
46}47return dis[t]>0;48
}4950int dfs(int u,int
flow)62}
63if (!res) dis[u]=-1;64
return
res;65}
6667
intdinic()
7273
intmain()
92 s=0,t=n*(n-1)/2+n+10+1,cnt=0;93
for (int i=1;i<=n;i++)
94for (int j=i+1;j<=n;j++)
100for (int i=1;i<=n;i++)
104for (int i=0;i<=9;i++)
105 add(n*(n-1)/2+n+i+1,t,(b[i]-a[i]));
106 n=t;
107 printf("
case #%d: %d\n
",++cas,ans-dinic());
108}
109 }
HDU5772 String problem
vjudge 給你一個0 9組成的字串,你可以從中選取一個子序列 或者說一個集合 。 如果位置 i j 同時被選,就可以獲得 w i j 的收益。 對於每一種數字,設其被選的次數為 k i ,那麼你需要對這個數字付出的代價為 a i k i 1 b i k i 0 0 k i 0 求最大收益。 考...
hdu 1565 最小割
黑白染色,源指向白,黑指向匯,容量都是方格中數的大小,相鄰的格子白指向黑,容量為oo,然後求一次最小割。 這個割是一個簡單割,如果只選擇不在割中的點,那麼一種割就和一個選數方案一一對應,割的大小就是不選的那些數的大小,我們需要最小化這個值。 答案 總和 最小割 1 include 2 include...
HDU 4289 Control(最小割)
題意 有n個城市,m條無向邊,小偷要從s點開始逃到d點,在每個城市安放監控的花費是sa i ,問最小花費可以監控到所有小偷。 思路 求最小割...