HDU2182 Frog
首先,原谅我写这么简单的dp题解,其是是因为我dp基础非常差
题意
给定4个数N,A,B,K
,在[0,N)
上每个坐标上都有一些昆虫,现在一只在坐标0的青蛙可以原地不动或通过向右跳A至B步,总共可以跳K次,问最多能够吃到多少只昆虫?
分析
首先考虑阶段性,跳i步的方案,不会影响跳i+1步的方案,所以阶段性就是先计算跳前i步,然后再计算跳前i+1步。
状态表示dp[i][j]
:跳跃前i步之后,落在位置j的方案数
状态转移:dp[i][j] = max(dp[i][j],dp[i-1][j-k])
k是跳跃的步长
然后看到状态转移dp[i][j]
只会与上一轮有联系,所以可以使用动态数组,虽然也在本题也节省不了多少内存
AC代码
使用了动态数组
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn = 1e6+100; typedef long long ll; int T; int N,A,B,K; int arr[111],dp[111]; int main(){ cin>>T; while(T--){ memset(dp,0,sizeof dp); scanf("%d%d%d%d",&N,&A,&B,&K); for(int i = 1;i<=N;i++) scanf("%d",&arr[i]); int res = 0; dp[1] = 1; for(int i = 1;i<=K;i++){ for(int j = N;j>=1;j--){ for(int k = A;k<=B;k++){ if(j-k>=1) dp[j] = max(dp[j],dp[j-k]+arr[j]); } res = max(res,dp[j]); } } printf("%d\n",res); } return 0; }