第一題:有 n 個學生站成一排,每個學生有一個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?


第一題:有 n 個學生站成一排,每個學生有一個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?

采用了兩個矩陣mx,mn

mx[i][j]是從i個選出j個,並以i為結束,滿足相鄰位置不大於j的最大乘積

mn[i][j]是從i個選出j個,並以i為結束,滿足相鄰

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 110
const long long INF=1e8;
long long a[N],mx[N][N],mn[N][N];//事先聲明了數組,因為最后數可能會很大,所以定義的longlong類型
long long max(long long a,long long b)
    {
    return a>b?a:b;
}
long long min(long long a,long long b)
    {
    return a>b?b:a;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)//這種輸入數組的方法
        scanf("%lld",&a[i]);
    int k,d;
    scanf("%d%d",&k,&d);
   
    for(int i=1;i<=n;i++)//初始化mx,mn數組
    {
        mx[i][0]=1;
        mn[i][0]=1;
        for(int j=1;j<=k;j++)
            {
            mx[i][j]=-INF;
            mn[i][j]=INF;
        }
    }
    long long mmx=-100,mnx=100;//mmx主要是用於當k=1時選出數組中最大的元素
    long long ans=-INF;
    for(int i=1;i<=n;i++)
    {
        mmx=max(mmx,a[i]);
        mx[i][1]=a[i];
        mn[i][1]=a[i];
        if(k==1)
            ans=max(ans,mmx);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=2;j<=k;j++)//j=1已經討論過了
        {
            for(int r=i-1;r>=max(1,i-d)&&r>=j-1;r--)//mx[r][j-1]表示從前r個中選出j-1個最大的乘積,所以r>=j-1;r只能最多回溯d個或者回溯到底
             {
                mx[i][j]=max(mx[i][j],mx[r][j-1]*a[i]);
                mx[i][j]=max(mx[i][j],mn[r][j-1]*a[i]);
                mn[i][j]=min(mn[i][j],mx[r][j-1]*a[i]);
                mn[i][j]=min(mn[i][j],mn[r][j-1]*a[i]);
                if(j==k) ans=max(ans,mx[i][j]);
            }
        }
    }
    cout<<ans;
}

 

位置不大於j的最小乘積


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 班上有學生若干名,已知每名學生的成績(整數),求班上所有學生的平均成績,保留到小數點后兩位。同時輸出該平均成績整數部分四舍五入后的數值。 第一行有一個整數n(1<= n <= 100),表示學生的人數。其后n行每行有1個整數,表示每個學生的成績,取值在int范圍內。 有n個學生的信息(包括學號,姓名,成績),要求按照成績的高低順序輸出各學生的信息 【JAVA】【作業向】第一題:本學期一班級有n名學生,m門課程。現要求對每門課程的成績進行統計:平均成績、最高成績、最低成績,並統計考試成績的分布律。 構建一個學生Student,根據類Student的定義,創建五個該類的對象,輸出每個學生的信息,計算並輸出這五個學生Java語言成績的平均值,以及計算並輸出他們Java語言成績的最大值和最小值。 有n個結構變量,內含學生學號,姓名和3門課程的成績。要求輸出平均成績的學生的信息 讀入n名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。 JAVA 數組實例-求學生成績的最大成績,獲取數組中的最大值、最小值 字符串數組 輸入3個字符串,要求按由小到大的字母順序輸出; 輸入n個學生的姓名和學號到字符串數組中,在輸入一個姓名,如果班級有該生則返回其信息,否則返回本班無此人 查詢每個學生的所選課程的最高成績,要求列出學號、姓名、課程編號、分數 給定一個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM