数组分组(简单dp)

一个长度为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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/lin1874/p/12333591.html
今日推荐