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;
} 
京公网安备 11010502036488号