乙個整數表示最多的盟友數。
樣例1 中,如果順序為「7,2,3」,可以使得 2,3,4,5 都和 djq 成為盟友。
狀壓dp。
我們設與1相鄰的點為a集合,與a集合相鄰的不在a集合且不是1的點為b集合。
除去ab兩個集合其他的數可以不看。
設f[ s ]表示a集合中的狀態所能獲得最大盟友數量。
f[s]=f[ s-i ]+與 i 相鄰的b集合中和1與 i 之間的關係相同的數的個數。
這樣只能通過70%的資料。
我們發現|a|+|b|只有41,那麼當|a|超過了20時,我們就可以用b集合來做狀壓。
設g[s]表示b集合中的狀態所能獲得最大盟友數量。
列舉a集合中的i,我們可以用a集合中i相鄰的b集合中不在s轉態中的點更新乙個新的s',即g[s']=g[s]+k.
注意到這樣時間是o(2^n*n^2),我們可以預處理出所有與a集合中第i個數相鄰的b集合的狀態為s時的盟友數,轉移直接加上任意乙個盟友,這樣我們就可以優化掉乙個n了。
時間複雜度o(2^n*n)。
#include#include#include#define mem(a,b) memset(a,b,sizeof(a))
#define i int
#define f(i,a,b) for(i i=a;i<=b;++i)
#define rt return
#define p(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
#define m 1200
#define n 45
using namespace std;
void rd(i &x)
}i n,m,x,y,z,st,cnt=0,t[m],h[n],id[n],a[n],b[n],bz[n],s[m],p[n],nx[m],lim[n],v[n][n],f[1048586],g[43][1048586];
void add(i x,i y,i z)
i log(i x)rt len;}
void work()
f(i,1,a[0]) if(((s>>i-1)&1)==0)
} printf("%d\n",f[(1<
}i main()
mem(f,-0x3f3f);f[0]=0;bz[1]=1;
for(i k=h[1];k;k=nx[k])
if(a[0]<=20) work();
else doit();
rt 0;
}
朋友圈分析1
conding utf 8 from wxpy import from pyecharts import pie,bar 1 建立機械人 bot bot cache path true 2 查詢朋友 friends bot.friends search 1 3 朋友總數 total len frie...
社交名片 朋友圈
序 不管你是否承認 現在朋友圈已經間接代表你的一些個人形象 為什麼要維護朋友圈 很多人會說 朋友圈是我自己的 我想發什麼就發什麼 或者乾脆就不發朋友圈 聽起來很有道理 其實不然 朋友圈這三個字的含義就是 圍繞你聚集起的乙個朋友圈子 少則幾百人 多則幾千人 所以這並不是你乙個人的私人領地 有時候你發一...
7 25 朋友圈(25 分)
7 25 朋友圈 25 分 某學校有n個學生,形成m個俱樂部。每個俱樂部裡的學生有著一定相似的興趣愛好,形成乙個朋友圈。乙個學生可以同時屬於若干個不同的俱樂部。根據 我的朋友的朋友也是我的朋友 這個推論可以得出,如果a和b是朋友,且b和c是朋友,則a和c也是朋友。請編寫程式計算最大朋友圈中有多少人。...