首页 > 试题广场 >

善变的同伴

[编程题]善变的同伴
  • 热度指数:8658 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
又到了吃午饭的时间,你和你的同伴刚刚研发出了最新的GSS-483型自动打饭机器人,现在你们正在对机器人进行功能测试。
为了简化问题,我们假设午饭一共有N个菜,对于第i个菜,你和你的同伴对其定义了一个好吃程度(或难吃程度,如果是负数的话……)A[i],
由于一些技(经)术(费)限制,机器人一次只能接受一个指令:两个数L, R——表示机器人将会去打第L~R一共R-L+1个菜。
本着不浪费的原则,你们决定机器人打上来的菜,含着泪也要都吃完,于是你们希望机器人打的菜的好吃程度之和最大
然而,你善变的同伴希望对机器人进行多次测试(实际上可能是为了多吃到好吃的菜),他想知道机器人打M次菜能达到的最大的好吃程度之和
当然,打过一次的菜是不能再打的,而且你也可以对机器人输入-1, -1,表示一个菜也不打

输入描述:
第一行:N, M

第二行:A[1], A[2], ..., A[N]


输出描述:
一个数字S,表示M次打菜的最大好吃程度之和
示例1

输入

7 2
1 2 3 -2 3 -10 3

输出

10

说明

[1 2 3 -2 3] -10 [3]
示例2

输入

7 4
1 2 3 -2 3 -10 3

输出

12

说明

[1 2 3] -2 [3] -10 [3]

第四次给机器人-1, -1的指令

备注:
N <= 10^5 = 100000

|A[i]| <= 10^4 = 10000

10%数据M = 1

50%数据M <= 2

80%数据M <= 100

100%数据M <= 10^4 = 10000
import java.util.Scanner;
//只能通过80%😂 public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        while(input.hasNext()) {
            int N = input.nextInt();
            int M = input.nextInt();
            int[] rank = new int[N];
            for(int i = 0; i < N; i++) {
               rank[i] = input.nextInt();
            }
            System.out.println(Solution(N, M, rank));
        }
        input.close();    
    }
     
    public static int Solution(int N, int M, int[] rank){
        int[] dp = new int[N+1];
        int[] pre_max = new int[N];
        for(int i = 1; i < M + 1; i++){
            for(int j = 1; j < N + 1; j++){
                dp[j] = rank[j-1] + ((dp[j-1] > pre_max[j-1]) ? dp[j-1] : pre_max[j-1]);
                if(j > 1) pre_max[j-1] = (pre_max[j-2] > dp[j-1]) ? pre_max[j-2] : dp[j-1];
            }
        }
        int max = dp[0];
        for(int i = 0; i < N + 1; i++) {
        	if(dp[i] > max) {
        		max = dp[i];
        	}
        }
        return max;
    }
}

发表于 2019-09-17 10:11:49 回复(0)
//最大m段字段和,动态规划dp[][];
//只通过80%,说数组越界,求解答
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt(),M=sc.nextInt();
        int[] A=new int[N];
        for(int i=0;i<N;i++){
            A[i]=sc.nextInt();
        }
        int[][] dp=new int[M+1][N+1];
        for(int i=1;i<=M;i++){
            int max=0;
            for(int j=i;j<=N;j++){
                //这里用max来表示dp[i-1][t]的最大值
                max=Math.max(max,dp[i-1][j-1]);
                dp[i][j]=Math.max(dp[i][j-1],max)+A[j-1];
            }
        }
        int ans=0;
        for(int i=1;i<=N;i++){
            ans=Math.max(ans,dp[M][i]);
        }
        System.out.println(ans);
    }
}
发表于 2019-08-05 21:33:16 回复(1)