想到的一種解法是,每隔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分,但這裡很容易犯的的乙個錯誤就是當在螢幕...