生活随笔
收集整理的這篇文章主要介紹了
动态规划 RQNOJ 吃西瓜 最大子段和三维版
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述
[說明]此題中出現(xiàn)的所有數(shù)全為整數(shù)
[背景]SubRaY有一天得到一塊西瓜,是長方體形的....
[題目描述]SubRaY發(fā)現(xiàn)這塊西瓜長m厘米,寬n厘米,高h(yuǎn)厘米.他發(fā)現(xiàn)如果把這塊西瓜平均地分成m*n*h塊1立方厘米的小正方體,那么每一小塊都會有一個營養(yǎng)值(可能為負(fù),因為西瓜是有可能壞掉的,但是絕對值不超過200).
現(xiàn)在SubRaY決定從這m*n*h立方厘米的西瓜中切出mm*nn*hh立方厘米的一塊小西瓜(一定是立方體形,長寬高均為整數(shù)),然后吃掉它.他想知道他最多能獲得多少營養(yǎng)值.(0<=mm<=m,0<=nn<=n,0<=hh<=h.mm,nn,hh的值由您來決定).
換句話說,我們希望從一個m*n*h的三維矩陣中,找出一個三維子矩陣,這個子矩陣的權(quán)和最大.
一個2*3*4的例子,最優(yōu)方案為切紅色2*3*1部分
[數(shù)據(jù)范圍]
對于30%的數(shù)據(jù),h=1,1<=m,n<=10
對于全部的數(shù)據(jù),1<=h<=32,1<=m,n<=50,保證h<=m,n
輸入格式
首行三個數(shù)h,m,n(注意順序),分別表示西瓜的高,長,寬.
以下h部分,每部分是一個m*n的矩陣,第i部分第j行的第k個數(shù)表示西瓜第i層,第j行第k列的那塊1立方厘米的小正方體的營養(yǎng)值.
輸出格式
SubRaY所能得到的最大營養(yǎng)值
樣例輸入
樣例輸出
三維狀態(tài)圖像
?
?
?
?
?
題目很明了~
?
[cpp]?view plaincopy
#include<stdio.h>?? #include<iostream>?? using?namespace?std;?? int?h,m,n,i,j,k;?? int?s[51][51][51],a[51][51][51],f[51][51][51][51];?? int?ans;?? int?main()?? {?? ????scanf("%d%d%d",&h,&m,&n);?? ????for?(i=1;i<=h;++i)?? ????????for?(j=1;j<=m;++j)?? ????????????for?(k=1;k<=n;++k)?? ????????????{?? ????????????????scanf("%d",&a[i][j][k]);?? ????????????????s[i][j][k]=s[i][j-1][k]+s[i][j][k-1]-s[i][j-1][k-1]+a[i][j][k];?? ????????????}?? ????for?(int?sj=1;sj<=m;++sj)?? ????????for?(int?sk=1;sk<=n;++sk)?? ????????????for?(int?ej=sj;ej<=m;++ej)?? ????????????????for?(int?ek=sk;ek<=n;++ek)?? ????????????????{?? ????????????????????f[sj][sk][ej][ek]=-99999;?? ????????????????????for?(i=1;i<=h;++i)?? ????????????????????{?? ????????????????????????int?tem=s[i][ej][ek]-s[i][sj-1][ek]-s[i][ej][sk-1]+s[i][sj-1][sk-1];?? ????????????????????????f[sj][sk][ej][ek]=max(f[sj][sk][ej][ek]+tem,tem);?? ????????????????????????if?(f[sj][sk][ej][ek]>ans)?ans=f[sj][sk][ej][ek];?? ????????????????????}?? ????????????????}?? ????printf("%d/n",ans);?? ????return?0;?? }??
總結(jié)
以上是生活随笔為你收集整理的动态规划 RQNOJ 吃西瓜 最大子段和三维版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。