poj 2385 來回走接蘋果dp

2021-07-03 13:26:28 字數 1373 閱讀 9818

題意:

有兩棵樹,奶牛開始時在樹1下,現在每分鐘兩棵樹中的某一棵會下蘋果,奶牛只可以移動w次。

給每分鐘下蘋果的順序,問奶牛最多能拿到多少蘋果。

解析:dp[ i ] [ j ] 表示的是在第i分鐘,移動了w次拿到的最多蘋果。

因為奶牛初始在樹1下,所以:

dp[i][0] = dp[i - 1][0] + (a[i] == 1 ? 1 : 0);
狀態轉移方程:

dp[i][j] = max(dp[i - 1 ] [j], dp[i-1][j-1]) + cnt

在第i分鐘奶牛到某棵樹下有兩種狀態:

從另一棵樹走過來(dp[i-1][j-1]);

本來就呆在這棵樹下(dp[i-1][j])。

所以在第i分鐘時能接到的最大蘋果數就是

dp[i][j]=max(dp[ i - 1 ] [ j ], dp[ i - 1 ] [ j - 1 ]) + cnt。

cnt的值:

如果j為偶數說明她移動了j次又回到了第一棵樹下,則cnt = (a[i]==1)?1:0;

若j為奇數說明她移動了j次後到了第二棵樹下,則 cnt =(a[i] == 2)?1:0。

**:

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define lson lo, mi, rt << 1

#define rson mi + 1, hi, rt << 1 | 1

using namespace std;

const int maxn = 1e6 + 10;

const int inf = 0x3f3f3f3f;

const double eps = 1e-8;

const double pi = acos(-1.0);

const double ee = exp(1.0);

int dp[1001][31];

int a[1001];

int main()

memset(dp, 0, sizeof(dp));

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

else

dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + cnt;}}

int ans = 0;

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

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

}return 0;

}

poj2385 很好的動態規劃

以前做的 poj2385 dp i j 表示第i分鐘移動j次最多蘋果數 注意初始化不移動時候 呆在第一棵樹下能吃到的蘋果數 第一分鐘可以移動到第二顆樹下吃蘋果 j的值的奇偶性能判斷牛的位置 能吃到的話可能從另一棵樹來,也可能是本身就在這棵樹下 不能吃到的話一定是本身就在這棵樹下 等他後面掉呢 不能吃...

DP,得到最多蘋果, POJ2385

題意 牛在兩棵蘋果樹下收集蘋果,牛只能在這兩棵樹之間走動w次,在t時刻,某棵樹會掉下蘋果。解題報告 dp t w 表示1 t秒內,轉w次能夠獲得的最多蘋果數目 狀態轉移方程 dp t w max dp t 1 w dp t 1 w 1 include include include using na...

poj 2385 樹上掉蘋果問題 dp演算法

題意 有樹1 樹2 會掉蘋果,奶牛去撿,只能移動w次,開始的時候在樹1 問最多可以撿多少個蘋果?思路 dp i j 表示i分鐘移動j次撿到蘋果的最大值 例項分析 0,1 1,2.說明 偶數在樹1 奇數在樹2 for int i 1 i n i for int i 1 i n i for int j ...