HDU 2182 Frog
题意: 给你一个长度为 n 的桥,上面每个坐标分布相应数量的蚊子,告诉你一个青蛙从 0 开始向终点跳跃,最多跳 k 步,问你最多能吃多少个蚊子。
分析: 状态转移方程 dp[i][j]=max(dp[i][j],dp[i-1][t]) j-r<=t<=j-l
dp[i][j] 表示在 j 位置,走了 i 步的最大值。
View Code
#include<stdio.h> #include<string.h> #define max(a,b)(a)>(b)?(a):(b) int dp[200][103]; int a[10002]; int main() { int t,i,j,n,l,r,k,z; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&n,&l,&r,&k); memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) scanf("%d",&a[i]); dp[0][0]=a[0]; int res=0; for(i=0;i<n;i++) { for(j=i+l;j<=i+r;j++) for(z=0;z<k;z++) { dp[j][z+1]=max(dp[j][z+1],dp[i][z]+a[j]); res=dp[j][z+1]>res?dp[j][z+1]:res; } } printf("%d\n",res); } return 0; }