日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java max sum_杭电1024 Max Sum Plus Plus状压dp(java)

發布時間:2024/10/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java max sum_杭电1024 Max Sum Plus Plus状压dp(java) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

現在我認為你已經在Ignatius.L的“最大總和”問題中得到了AC。為了成為一名勇敢的ACMer,我們總是向更難挑戰的問題挑戰自我。現在你面臨著一個更困難的問題。

給定連續的數字序列S1,S2,S3,S4 … Sx,… Sn(1≤x≤n≤1,000,000,-32768≤Sx≤32767)。我們定義了函數和(i,j)= Si … Sj(1≤i≤j≤n)。

現在給定一個整數m(m> 0),你的任務是找到m對i和j,它們使sum(i1,j1) sum(i2,j2) sum(i3,j3) … sum (im,jm)maximal(ix≤iy≤jx或者ix≤jy≤jx是不允許的)。

但我很懶惰,我不想寫一個專門的判斷器模塊,所以你不必輸出m對i和j,只輸出sum(ix,jx)的最大和(1≤x ≤m)。 ^ _ ^

輸入

每個測試用例將以兩個整數m和n開始,隨后是n個整數S1,S2,S3 … Sn。

處理到文件的結尾。

產量

在一行中輸出上述最大和。

示例輸入

1 3 1 2 3

2 6 -1 4 -2 3 -2 3

示例輸出

6

8

這題剛開始不明白,后來看了別人的思路。用dp[m][n]自己做出來但是數組太大,后來又繼續學習,發現人家把多維的壓縮成二維,看了好久才看明白。。

首先 value[i][j]表示以第j個元素結尾的i對最大,(dp經常處理的是以誰為結尾)

dp[i][j]表示第j元素中要求的最大。

i>j時:

value[i][j] = max( value[i][j-1] a[j], max( value[i-1][t] (i-1<=t <= j-1) a[j]))可以理解。

簡單而說value[i][j] = max(i對以第j-1結尾 a[j],i-1對前j-1個找最大 a[j]);(直接接上,和最后一個單獨取)

那么 value[i][j]=max(value[i][j-1] a[j],dp[i-1][j-1] a[j]);

然而 dp[i][j]=max(以第j個結尾的最大,不以第j個結尾)。

可以表示為:dp[i][j]=max(value[i][j],dp[i][j-1])

最終得到方程組:

value[i][j]=max(value[i][j-1] a[j],dp[i-1][j-1] a[j]);

dp[i][j]=max(value[i][j],dp[i][j-1]) ;

dp[i][j]只和當前的 dp[i][]和 value[i][]有關,和前面的數據無關,而value[i][]只和value[i][]和dp[i-1][]有關,可以想一下,每一次i循環,我求這組的數據value要重新賦值,并且和dp[i][]層,和dp[i-1][]層有關,那么我就可以直接用value[j]表示當前i層的以j為結尾的最大。同理第i層的dp求要用到前面的dp[i][]和上一層的dp[i-1][];那么可以簡寫為 dp[i%2][j]表示當前i的以j之中的最大。

簡寫為:

value[j]=max(value[j-1] a[j],dp[(i-1)%][j-1] a[j]);

dp[i%2][j]=max(value[j],dp[i%2][j-1]) ;

打個比方:爸爸媽媽兒子女兒洗澡,一個人要一個桶泡,你有錢可以買四個桶一人一個洗澡,你沒錢就爸爸先用,然后媽媽,女兒,兒子用。

附上代碼如下:

import java.util.Scanner;

public class 杭電1024 {

public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()) { int m=sc.nextInt();//對數 int n=sc.nextInt();//元素個數 int a[]=new int[n 1];//元素值 int dp[][]=new int[2][n 1]; int value[]=new int[n 1]; int q=0;int max=0; for(int i=1;ii) { value[j]=max(dp[(i-1)%2][j-1] a[j],value[j-1] a[j]);// dp[i%2][j]=max(dp[i%2][j-1],value[j]);// } } } System.out.println(dp[m%2][n]); }

}

private static int max(int i, int value) { return i>value?i:value;

}

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

文章來源: bigsai.blog.csdn.net,作者:Big sai,版權歸原作者所有,如需轉載,請聯系作者。

原文鏈接:bigsai.blog.csdn.net/article/details/79628860

總結

以上是生活随笔為你收集整理的java max sum_杭电1024 Max Sum Plus Plus状压dp(java)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。