POJ - 2385 Apple Catching (dp)
題意:有兩棵樹,標號為1和2,在Tmin內,每分鐘都會有一個蘋果從其中一棵樹上落下,問最多移動M次的情況下(該人可瞬間移動),最多能吃到多少蘋果。假設該人一開始在標號為1的樹下。
分析:
1、dp[x][y][z]---第x分鐘移動了y次的情況下,現在位于標號為z的樹下最多吃到的蘋果數。
2、枚舉所有的時間、次數和可能位于的樹下。
若第i分鐘該人位于標號為k的樹下,第i + 1分鐘蘋果從標號為a[i+1]的樹上落下。
(1)k==a[i],
此人站在標號為k的樹下不移動,即可再吃到一個蘋果:dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k] + 1);
此人多方面權衡后選擇移動到另一棵樹下,則移動但吃不到蘋果:dp[i + 1][j + 1][Move(k)] = max(dp[i + 1][j + 1][Move(k)], dp[i][j][k]);
(2)k!=a[i],
此人移動到另一棵樹下,即可再吃到一個蘋果:dp[i + 1][j + 1][Move(k)] = max(dp[i + 1][j + 1][Move(k)], dp[i][j][k] + 1);
此人多方面權衡后選擇不移動,因此吃不到蘋果:dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k]);
#include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #include<sstream> #include<iterator> #include<algorithm> #include<string> #include<vector> #include<set> #include<map> #include<stack> #include<deque> #include<queue> #include<list> #define lowbit(x) (x & (-x)) const double eps = 1e-8; inline int dcmp(double a, double b){if(fabs(a - b) < eps) return 0;return a > b ? 1 : -1; } typedef long long LL; typedef unsigned long long ULL; const int INT_INF = 0x3f3f3f3f; const int INT_M_INF = 0x7f7f7f7f; const LL LL_INF = 0x3f3f3f3f3f3f3f3f; const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f; const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1}; const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1}; const int MOD = 1e9 + 7; const double pi = acos(-1.0); const int MAXN = 1000 + 10; const int MAXT = 10000 + 10; using namespace std; int dp[MAXN][35][3]; int a[MAXN]; int Move(int k){return k == 1 ? 2 : 1; } int main(){int T, W;scanf("%d%d", &T, &W);for(int i = 1; i <= T; ++i){scanf("%d", &a[i]);}if(a[1] == 1){dp[1][0][1] = 1;}else{dp[1][1][2] = 1;}for(int i = 1; i <= T - 1; ++i){for(int j = 0; j <= W; ++j){for(int k = 1; k <= 2; ++k){if(k == a[i + 1]){dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k] + 1);dp[i + 1][j + 1][Move(k)] = max(dp[i + 1][j + 1][Move(k)], dp[i][j][k]);}else{dp[i + 1][j + 1][Move(k)] = max(dp[i + 1][j + 1][Move(k)], dp[i][j][k] + 1);dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k]);}}}}int ans = 0;for(int i = 0; i <= W; ++i){for(int j = 1; j <= 2; ++j){ans = max(ans, dp[T][i][j]);}}printf("%d\n", ans);return 0; }
轉載于:https://www.cnblogs.com/tyty-Somnuspoppy/p/6632914.html
總結
以上是生活随笔為你收集整理的POJ - 2385 Apple Catching (dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机 映射网络驱动器,映射网络驱动器
- 下一篇: 接口测试工具-fiddler的运用