顯然的思路,用網路流做。
對每個洞拆點,i.j表示第i個洞被通過這個洞的倒數第j隻鳥通過。
然後連邊跑費用流。
然而邊數太多直接**,怎麼辦?
注意到i.j沒被流i.j+1就絕不可能被流。
因此動態加邊,初始只連所有到x.1的。
目前連到x.y,流成功一次加上所有到x.y+1的邊。
然後莫名很慢,所以這裡本辣雞加上了對只有乙個洞的特判(面向資料程式設計)
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int maxn=100000+10,maxm=7000000+10,inf=1000000000;
int h[maxn],d[maxn],now[maxn],go[maxm],dis[maxm],co[maxm],fx[maxm],next[maxm];
int id[150][850],di[150
*850+10][2],time[50][150],a[50],w[850];
bool bz[maxn];
int i,j,k,l,r,s,t,n,m,p,tot,top,ans,last;
void add(int
x,int
y,int z,int c,int d)
int dfs(int
x,int flow,int las,int cost)
bz[x]=1;
int r=now[x],k;
while (r)
}r=next[r];
}return now[x]=0;
}bool change()
}if (tmp==inf) return
0; fo(i,s,t)
if (bz[i]) d[i]+=tmp;
return1;}
intread()
returnx;}
int main()
s=1;t=p*m+n+2;
fo(i,1,n)
top=n+1;
fo(i,1,m)
fo(j,1,p)
if (j<=p)}do
fill(bz+s,bz+t+1,0);
}}while (change());
printf("%d\n",ans);
}
飛揚的小鳥
飛揚的小鳥 這一題開始看到時就知道是dp,但作死打了個dfs,只有75分 卡常 好 includeusing namespace std const int n 10005 const int inf 9999999 int g sum n g up n g down n up n down n n...
飛揚的小鳥
首先這道題爆搜可做,理論上可以拿50分的,但由於windows下棧空間只有3w多,所以只能拿到35分。然後我們考慮dp 應該很容易想到是dp 定義狀態f i j 為在點 i,j 時最少的觸屏次數,然後列舉觸屏次數轉移即可。這樣複雜度是o nm 2 可以拿70分,但這裡很容易犯的的乙個錯誤就是當在螢幕...
飛揚的小鳥
題目描述 為了簡化問題,我們對遊戲規則進行了簡化和改編 1 遊戲介面是乙個長為n,高為m的二維平面,其中有k個管道 忽略管道的寬度 2 小鳥始終在遊戲介面內移動。小鳥從遊戲介面最左邊任意整數高度位置出發,到達遊戲介面最右邊時,遊戲完成。3 小鳥每個單位時間沿橫座標方向右移的距離為1,豎直移動的距離由...