牛客 Subset of Five ###K ###K ###K //K

题目链接:https://ac.nowcoder.com/acm/problem/206673

思路:每个数都可以拿或者不拿 考虑数据范围 并且求的是最大值

那么很明显就类似一个01背包问题了 

问题在于状态转移方程   令dp[i][j] 为前i个数mod为j的最大值

那么当前的状态就可以从前一个状态转移过来 假设当前求的为j 那么上一个设为y  (y+a[i])%5=j

解出y 即可 考虑到负数 所以再加一个mod再取mod  然后就是边界的处理 有些取不到的值 要初始化一下    初始化的负数要大一点

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int maxn=1e6+10;
 6 ll a[maxn];
 7 ll dp[maxn][5];
 8 
 9 int main()
10 {
11     ios::sync_with_stdio(false);
12     cin.tie(0);
13     int n;
14     cin>>n;
15     for(int i=1;i<=n;i++)
16     {
17         cin>>a[i];
18     }
19     for(int i=0;i<=n;i++)
20     {
21         for(int j=0;j<=4;j++)
22             dp[i][j]=-1e18;
23     }
24     dp[0][0]=0;
25     for(int i=1;i<=n;i++)
26     {
27         int x=a[i]%5;
28         for(int j=0;j<=4;j++)
29         {
30             dp[i][j]=max(dp[i-1][(j-x+5)%5]+a[i],dp[i-1][j]);
31         }
32     }
33     cout<<dp[n][0]<<'\n';
34 
35 
36 }
View Code

 

posted @ 2020-06-16 17:17  canwinfor  阅读(116)  评论(0)    收藏  举报