阿里笔试 4.24 求指导
题意:给定一个n个元素的数组和m,从数组中挑选一个子序列,子序列的和对m取余最大,输出这个最大的余数。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; long m; cin >> n; cin >> m; vector<long> vec(n); long sum = 0; for(int i = 0; i < n; i++) { cin >> vec[i]; vec[i] = vec[i] % m; //数组存求余后的值 sum += vec[i]; } if(sum < m) { cout << sum; return 0; } vector<long> dp(n); //dp[i]的意思是以数组i结尾的子序列的最大余数 dp[0] = vec[0]; for(int i = 1; i < n; i++) { dp[i] = dp[i - 1]; //不拿 for(int j = 1; j <= i; j++) { dp[i] = max(dp[i], (vec[i]+dp[i-j]) % m);//拿 } } cout << dp[n - 1]; return 0; }
自测的样例没问题
输入:
6 11
4 12 3 7 6 2
输出:
10
6 11
4 12 3 7 6 2
输出:
10
求指点!