日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/3/20 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杭电1024 Max Sum Plus Plus状压dp(java) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問(wèn)題描述

現(xiàn)在我認(rèn)為你已經(jīng)在Ignatius.L的“最大總和”問(wèn)題中得到了AC。為了成為一名勇敢的ACMer,我們總是向更難挑戰(zhàn)的問(wèn)題挑戰(zhàn)自我。現(xiàn)在你面臨著一個(gè)更困難的問(wèn)題。
給定連續(xù)的數(shù)字序列S1,S2,S3,S4 … Sx,… Sn(1≤x≤n≤1,000,000,-32768≤Sx≤32767)。我們定義了函數(shù)和(i,j)= Si … Sj(1≤i≤j≤n)。
現(xiàn)在給定一個(gè)整數(shù)m(m> 0),你的任務(wù)是找到m對(duì)i和j,它們使sum(i1,j1) sum(i2,j2) sum(i3,j3) … sum (im,jm)maximal(ix≤iy≤jx或者ix≤jy≤jx是不允許的)。
但我很懶惰,我不想寫一個(gè)專門的判斷器模塊,所以你不必輸出m對(duì)i和j,只輸出sum(ix,jx)的最大和(1≤x ≤m)。 ^ _ ^
輸入
每個(gè)測(cè)試用例將以兩個(gè)整數(shù)m和n開始,隨后是n個(gè)整數(shù)S1,S2,S3 … Sn。
處理到文件的結(jié)尾。
產(chǎn)量
在一行中輸出上述最大和。
示例輸入
1 3 1 2 3
2 6 -1 4 -2 3 -2 3
示例輸出
6
8

這題剛開始不明白,后來(lái)看了別人的思路。用dp[m][n]自己做出來(lái)但是數(shù)組太大,后來(lái)又繼續(xù)學(xué)習(xí),發(fā)現(xiàn)人家把多維的壓縮成二維,看了好久才看明白。。

首先 value[i][j]表示以第j個(gè)元素結(jié)尾的i對(duì)最大,(dp經(jīng)常處理的是以誰(shuí)為結(jié)尾)
dp[i][j]表示第j元素中要求的最大。
i>j時(shí):
value[i][j] = max( value[i][j-1] a[j], max( value[i-1][t] (i-1<=t <= j-1) a[j]))可以理解。

簡(jiǎn)單而說(shuō)value[i][j] = max(i對(duì)以第j-1結(jié)尾 a[j],i-1對(duì)前j-1個(gè)找最大 a[j]);(直接接上,和最后一個(gè)單獨(dú)取)
那么 value[i][j]=max(value[i][j-1] a[j],dp[i-1][j-1] a[j]);

然而 dp[i][j]=max(以第j個(gè)結(jié)尾的最大,不以第j個(gè)結(jié)尾)。
可以表示為: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]只和當(dāng)前的 dp[i][]和 value[i][]有關(guān),和前面的數(shù)據(jù)無(wú)關(guān),而value[i][]只和value[i][]和dp[i-1][]有關(guān),可以想一下,每一次i循環(huán),我求這組的數(shù)據(jù)value要重新賦值,并且和dp[i][]層,和dp[i-1][]層有關(guān),那么我就可以直接用value[j]表示當(dāng)前i層的以j為結(jié)尾的最大。同理第i層的dp求要用到前面的dp[i][]和上一層的dp[i-1][];那么可以簡(jiǎn)寫為 dp[i%2][j]表示當(dāng)前i的以j之中的最大。
簡(jiǎn)寫為:
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]) ;

打個(gè)比方:爸爸媽媽兒子女兒洗澡,一個(gè)人要一個(gè)桶泡,你有錢可以買四個(gè)桶一人一個(gè)洗澡,你沒(méi)錢就爸爸先用,然后媽媽,女兒,兒子用。
附上代碼如下:

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();//對(duì)數(shù)int n=sc.nextInt();//元素個(gè)數(shù)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;}}

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。