这道题的意思是给你一串数字, 每一个数字可以通过一个公式转换成其他的数, 你可以转换一个连续区间的数, 让这一串数字的和最大。。只需要做一个小小的转换就可以转化问题为最大连续和。 具体见代码, 不过需要注意最大连续和的递推式是d[i] = max(c[i], d[i-1]+c[i])不要弄错了。。代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int inf = 0x3f3f3f3f; int A[100000 + 100]; int F[100000 + 100]; int C[100000 + 100]; int d[100000 + 100]; int main() { int n; while(scanf("%d", &n) == 1) { int sum = 0; for(int i=0; i<n; i++) { scanf("%d", &A[i]); F[i] = (1890*A[i]+143)%10007; C[i] = F[i] - A[i]; //求出转化后的数字和原序列差,然后求解最长连续子序列即可 sum += A[i]; } for(int i=0; i<n; i++) d[i] = -inf; d[0] = C[0]; int max1 = d[0]; for(int i=1; i<n; i++) { d[i] = max(C[i], d[i-1]+C[i]); max1 = max(max1, d[i]); } if(max1 >= 0) //这里注意max1<0的情况 printf("%d\n", sum+max1); else printf("%d\n", sum); } return 0; }
时间: 2024-10-11 03:19:43