luogu 1941 飛揚的小鳥

2022-02-24 16:26:48 字數 1276 閱讀 7873

這道題對於第13個資料點,不知為什麼f陣列第二位開到2000以下就不能過,求指教

傳送門

乙個小鳥在\(n*m\)的方陣裡,然後有許多管道你們玩過就不多介紹了,然後每乙個位置,點選會上公升,不點選可以下降,點選效果可以疊加。

求如果通關的最小點選次數,否則會最多通過多少個管道。

就是搜尋,本以為會拿50pts。

#include #include #include #include #include using namespace std;

int n,m,k,up[20000],down[20000],vis[20000],flag,maxn,minn=0x7fffffff;

struct edge e[20000];

void dfs(int x,int h,int tot)

if(vis[x+1])

if(h-down[x]e[x+1].d ) dfs(x+1,h-down[x],tot);

} else

dfs(x+1,h-down[x],tot);

}}int main()

for(int i=0; i<=m; i++)

if(vis[i] && i>e[i].d && i動態規劃

這道題如果細想,還真是可以用揹包做,雖然限制條件多了一點。

如果小鳥向上飛,則是完全揹包。

如果小鳥向下飛,則是01揹包。

如果小鳥遇到柱子,那麼將此狀態取消

如果小鳥飛到m以上,那麼定為m。

最後輸出倒敘查詢dp陣列就可以了

#include#include#includeusing namespace std;

int f[10010][2010];

int n,m,k;

int x[10010],y[10010];

int vis[10010];

int low[10010],high[10010];

int main()

memset(f,0x3f,sizeof(f));

for(int i=1; i<=m; ++i) f[0][i]=0;

for(int i=1; i<=n; ++i)

ans=0;

for(int p=1; p<=i; ++p)

if(vis[p])ans++;

printf("0\n%d",ans);

}return 0;

}

Luogu1941 飛揚的小鳥

這題的 dp 還是比較顯然的 聽說是個完全揹包,大概轉移是差不多的 就從當前層順著列舉 j 往大去更新同層的就好了 其實這樣每次往高處轉移的就是下面的字首最小值 值得注意的是題意要模擬的是遊戲 所以顯然不能先掉下去在在同一步中往上飛 所以轉移順序是不能亂的 就是先轉移往上飛的在轉移往下掉的 好像多開...

Luogu 飛揚的小鳥

bfs or dp include using namespace std const int n 1e4 10 define gc getchar define oo 99999999 struct node 1 p n struct node 2 m n struct node intn,m,k...

P1941 飛揚的小鳥

定義dp i j 表示走到座標 i,j 時的最小點按次數。考慮遞推關係,能走到座標 i,j 一種情況是從前乙個位置下降上公升的轉移是乙個完全揹包,下降是01揹包。include using namespace std define ll long long define inf 0x3f3f3f d...