AcWing 512 飛揚的小鳥 dp

2022-05-11 05:04:49 字數 1153 閱讀 5720

想到的一種解法是,每隔x個高度抽點出來。

比如從j高度開始。

判斷j+x高度時:

dp[i][j]+1

判斷j+2x高度時:

dp[i][j+x]+1,dp[i][j]+2

可以看到後面的這個是一起+1的,所以最小值也是和新加的項取min,然後+1就可以了。

每個點只會被更新一次,複雜度o(nm)。

#include using namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

int n, m, k;

int dp[2][1005];

pairl[10005], r[10005];

int x[10005], y[10005];

void update1(int i, int p, int x, int y)

else

curmin = min(curmin, dp[!i][q]) + 1;

}//要在另乙個函式把碰到管道的置為inf

/*for(int p = 1; p <= n; ++p)

printf("\n");*/

}int curp = 1;

void update2(int i)

printf("%d\n%d\n", 0, curp - 1);

exit(0);

}}int main()

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

sort(l + 1, l + 1 + k);

sort(r + 1, r + 1 + k);

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

printf("\n");*/

update2(i);

/*for(int p = 1; p <= n; ++p)

printf("\n");*/

}int ans = inf;

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

ans = min(ans, dp[n & 1][p]);

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

return 0;

}

飛揚的小鳥

顯然的思路,用網路流做。對每個洞拆點,i.j表示第i個洞被通過這個洞的倒數第j隻鳥通過。然後連邊跑費用流。然而邊數太多直接 怎麼辦?注意到i.j沒被流i.j 1就絕不可能被流。因此動態加邊,初始只連所有到x.1的。目前連到x.y,流成功一次加上所有到x.y 1的邊。然後莫名很慢,所以這裡本辣雞加上了...

飛揚的小鳥

飛揚的小鳥 這一題開始看到時就知道是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分,但這裡很容易犯的的乙個錯誤就是當在螢幕...