洛谷 P1802 5倍经验日(dp)

传送门


解题思路

很显然的一道类似01背包的dp,每个人选择打或不打。

状态转移方程为

dp[i][j]=max(dp[i-1][j]+lose[i],dp[i-1][j-num[i]]+win[i])

但这个题还是比较细节的,要注意一下几点:

  • 数组要用long long,否则最后一个点会炸(因为答案最终要*5)
  • 失败拿经验是不需要药的

AC代码

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<cstring>
 6 using namespace std;
 7 const int maxn=1005;
 8 long long dp[maxn][maxn],win[maxn],lose[maxn],num[maxn],n,m; 
 9 int main()
10 {
11     cin>>n>>m;
12     for(int i=1;i<=n;i++){
13         cin>>lose[i]>>win[i]>>num[i];
14     }
15     for(int i=1;i<=n;i++){
16         for(int j=0;j<=m;j++){
17             if(j<num[i]) dp[i][j]=dp[i-1][j]+lose[i];
18             else{
19                 dp[i][j]=max(dp[i-1][j]+lose[i],dp[i-1][j-num[i]]+win[i]);
20             }
21         }
22     }
23     cout<<dp[n][m]*5;
24     return 0;
25 }

 

posted @ 2020-10-15 22:50  尹昱钦  阅读(131)  评论(0编辑  收藏  举报