這道題對於第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...