dp[i][j] = max(dp[i-1][j]+第i只鸟不使用double可杀死的怪兽数, dp[i-1][j-1]+第i只鸟使用double可杀死的怪兽数)
dp[i][j]指前i只鸟使用j次double可杀死的怪兽数
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int dp[10010][110],rest[10010][110]; int ac[10010],bc[100010],n,m,k; int cc(int acc, int &bcc, int now) { int flag = 1; while(now < k) { if(acc > bcc) //m>n { acc -= bcc; now++; bcc = bc[now+1]; flag = 0; } else if(acc == bcc) //m==n { now++; bcc = bc[now+1]; break; } else if(flag) //m<n且还是YoungBrid { bcc -= acc; break; } else //m<n且已经是OldBrid break; } return now; } int main() { while(scanf("%d%d%d",&n,&m,&k) == 3 && n+m+k) { for(int i = 1; i <= n; i++) scanf("%d",&ac[i]); for(int i = 1; i <= k; i++) scanf("%d",&bc[i]); memset(dp, 0, sizeof(dp)); m = min(m, n); rest[0][0] = rest[0][1] = bc[1]; for(int i = 1; i <= n; i++) { int res = rest[i-1][0]; dp[i][0] = cc(ac[i], res, dp[i-1][0]); rest[i][0] = res; for(int j = 1; j <= min(m, i); j++) { int res1 = rest[i-1][j], res2 = rest[i-1][j-1]; int k1 = cc(ac[i], res1, dp[i-1][j]), k2 = cc(ac[i]*2, res2, dp[i-1][j-1]); if(k1 > k2) { dp[i][j] = k1; rest[i][j] = res1; } else if(k1 < k2) { dp[i][j] = k2; rest[i][j] = res2; } else { dp[i][j] = k1; rest[i][j] = min(res1, res2); } } } printf("%d\n",dp[n][m]); } return 0; }