百练OJ:4150:上机
描述
又到周末了,同學們陸陸續續開開心心的來到機房上機。jbr也不例外,但是他到的有點晚,發現有些機位上已經有同學正在做題,有些機位還空著。細心的jbr發現,一位同學來到機房,坐在機位i上,如果他的左右兩邊都空著,他將獲得能力值a[i];如果當他坐下時,左邊或者右邊已經有一個人在上機了,他將獲得能力值b[i];如果當他坐下時,他的左邊右邊都有人在上機,他將獲得能力值c[i]。
同時他發現,已經在上機的同學不會受到剛要坐下的同學的影響,即他們的能力值只會在坐下時產生,以后不會發生變化;第一個機位左邊沒有機位,最后一個機位右邊沒有機位,無論何時坐在這兩個機位上將無法獲得c值。
這時jbr發現有一排機器還空著,一共有N個機位,編號1到N。這時有N位同學們陸陸續續來到機房,一個一個按照順序坐在這排機位上。聰明的jbr想知道怎么安排座位的順序,可以使這N位同學獲得能力值的和最大呢?
輸入
第一行一個整數N(1<= N <= 10000)
第二行N個數,表示a[i]
第三行N個數,表示b[i]
第四行N個數,表示c[i]
(1<= a[i],b[i],c[i] <=10000)
輸出
一個整數,表示獲得最大的能力值和
樣例輸入
4 1 2 2 4 4 3 3 1 2 1 1 2樣例輸出
14提示
第一位同學坐在第四個機位上,獲得能力值4;
第二位同學坐在第三個機位上,獲得能力值3;
第三位同學坐在第二個機位上,獲得能力值3;
第四位同學坐在第一個機位上,獲得能力值4;
總和為14。
代碼
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] a = new int[n + 2];int[] b = new int[n + 2];int[] c = new int[n + 2];for (int i = 1; i <= n; i++) {a[i] = scanner.nextInt();}for (int i = 1; i <= n; i++) {b[i] = scanner.nextInt();}for (int i = 1; i <= n; i++) {c[i] = scanner.nextInt();}//f[0][i]表示第i個座位進入時 第i+1個座位上沒有人//f[1][i]表示第i個座位進入時 第i+1個座位上有人//所以f[0][i+1]=max(f[0][i]+b[i+1], f[1][i] + a[i+1])//首先f[0][i+1]的f[0]確保i+2位置沒有人,所以如果i有人就是f[0][i]+b[i+1],如果i無人就是f[1][i] + a[i+1]int f[][] = new int[2][n + 1];f[0][1] = a[1];f[1][1] = b[1];for (int i = 2; i <= n; i++) {f[0][i] = Math.max(f[0][i - 1] + b[i], f[1][i - 1] + a[i]);f[1][i] = Math.max(f[0][i - 1] + c[i], f[1][i - 1] + b[i]);}System.out.println(f[0][n]);}}結果
Accepted
總結
以上是生活随笔為你收集整理的百练OJ:4150:上机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【java】将PDF转成字符串
- 下一篇: LeetCode:62. 不同路径