一个长度为n的数组a,我们可以把它分成任意组,每一组是一段连续的区间。比如数组1,2,3,4,5可以分成(1,2),(3,4,5)两个组。
每个分组都有一个权值,这个权值就是分组里面每个数的乘积对1000取模的结果。
对于数组a的一个分组方案,总权值就是每个分组的权值和。
name对于数组a,分组以后最大的权值和是多少?
输入
第一行一个n(<=1n<=1000)
接下来一行n个整数,表示数组a,ai<=100
输出
数组最大的分组权值和
简单dp?
预处理 区间i-j的乘积和
dp[i]:前i个分组最大权值和。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1110; const int MOD=1000; int a[MAXN],n; int dp[MAXN]; int pre[MAXN][MAXN]; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ pre[i][i]=a[i]; for(int j=i+1;j<=n;j++){ pre[i][j]=pre[i][j-1]*a[j]%MOD; } } for(int i=1;i<=n;i++){ for(int j=0;j<i;j++){ dp[i]=max(dp[i],dp[j]+pre[j+1][i]); } } cout<<dp[n]<<endl; return 0; }