题目大意:
给n个数A1,A2....An,你可以选择一个区间(也可以不选),区间里每个数x变成f(x),其中f(x)=(1890x+143) mod 10007f(x)=(1890x+143)mod10007。问最后n个数之和最大可能为多少。 解题思路: 动态规划,求最大连续子序列和,在开一个数组,记录f(ai)-ai的值,对这个序列求最大连续子序列和,然后把所有ai的值加一起,在和前边的最大连续子序列和加起来就是答案了。最大连续子序列和的状态转移方程: f(i)=max(f(i-1)+ai,ai) ac代码#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int maxn=1e5+1000; int a[maxn],n; long long dp[maxn],b[maxn]; int main() { while(scanf("%d",&n)!=EOF) { long long sum=0,ret=0; for(int i=0;i<n;i++) { scanf("%d",a+i); sum+=a[i]; b[i]=((1890*a[i]+143)%10007-a[i]); } ret=b[0]; dp[0]=b[0]; for(int i=1;i<n;i++) { dp[i]=max(dp[i-1]+b[i],b[i]); ret=max(ret,dp[i]); } if(ret>=0) printf("%I64d\n",sum+ret); else printf("%I64d\n",sum); } return 0; }