牛客 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 }

浙公网安备 33010602011771号