**
首先想到設f[i][j]表示到第i行第j列所需要的最少點選螢幕次數。轉移方程為
f[ i ][ j ]=min (1<= k <= j/x) 上公升——①
f[ i ][ j ]=min ( j + y[i-1] <= m) 下降
顯然,下降可以o(1)轉移,主要問題在上公升的轉移。
我們將上公升的方程變一下:
f[ i ][ j - x[i-1] ]=min ——②
這是 f[ i ][ j - x[i-1] ] 的轉移。
由 ② 化簡可得:
f[ i ][ j - x[i-1] ]=min——③
由①③消去f[ i-1 ][ j - k*x[ i-1] ]+k可得
f[ i ][ j ]= f[ i ][ j - x[ i-1 ] ]+1
於是就可以o(n*m)的時間內出解
#includeusingnamespace
std;
int dp[10005][2005], low[10005], hi[10005], a[10005], b[10005], to[10005
];int
ans, n, m, k, x, l1, l2;
intmain()
for(int i = 1; i <= k; i++)
memset(dp,
0x3f, sizeof
(dp));
for(int i = 1; i <= m; i++)
dp[0][i] = 0
;
for(int i = 1; i <= n; i++)
ans = 0x3f3f3f
;
for(int i = 1; i <= m; i++) ans =min(ans, dp[n][i]);
if(ans < 0x3f3f3f
)
inti, j;
for(i = n; i >= 1; i--)
ans = 0
;
for(int j = 1; j <= i; j++)
if(to[j]) ans++;
cout
<< "0"
<< endl
}
luogu P1941 飛揚的小鳥
為了簡化問題,我們對遊戲規則進行了簡化和改編 遊戲介面是乙個長為n 高為 m 的二維平面,其中有k 個管道 忽略管道的寬度 小鳥始終在遊戲介面內移動。小鳥從遊戲介面最左邊任意整數高度位置出發,到達遊戲介面最右邊時,遊戲完成。小鳥每個單位時間沿橫座標方向右移的距離為1 豎直移動的距離由玩家控制。如果點...
Luogu P1941飛揚的小鳥(DP)
我發現現在沒了題解我做普及提高 的題也做不了 更不要說這些提高 難度的 題 此題是乙個二維dp。暴力是三重迴圈ijk,k列舉在i位置上的點選次數。即 for int i 1 i n i for int j 1 j m j for int k 1 j k up i 0 k f i j min f i ...
luoguP1941福賴皮波德
include include include include include include using namespace std const int maxn 10010 const int inf 20172136 inline intread while isdigit ch return...