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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 1244 DP

發(fā)布時(shí)間:2023/12/2 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 1244 DP 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目大意:

我們需要將一串?dāng)?shù)字分成多個(gè)確定個(gè)數(shù)的連續(xù)段,在得到所有段的和的最大值

?

定義一個(gè)dp[i][j]數(shù)組表示在前j個(gè)數(shù)中取滿 i 個(gè)段所能得到的最大值

那么也就是說明在這道題目當(dāng)中每一段都是必須要被取到的

能夠取到的前提是 j >= cnt[i] //表示前 i 段的數(shù)字個(gè)數(shù)總和

sum[i] 表示前 i 個(gè)數(shù)字之和

我們可以分成兩種情況,一種是第i段取到以j號(hào)數(shù)字結(jié)尾

得到dp[i-1][j-l[i]] + sum[j] - sum[j-l[i]]

第二種是不以j號(hào)數(shù)字結(jié)尾

得到dp[i][j-1]

?

我們每次在其中取最大值就好了

?

#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int INF = 200000000; const int M = 22; const int N = 1005;int dp[M][N] , l[M] , a[N] , cnt[M] , sum[N];int main() {int m , n;while(scanf("%d" , &n) , n){scanf("%d" , &m);for(int i = 1 ; i<=m ; i++){scanf("%d" , l+i);cnt[i] = cnt[i-1] + l[i];}for(int i = 1 ; i<= n ; i++){scanf("%d" , a+i);sum[i] = sum[i-1] + a[i];}memset(dp , 0 , sizeof(dp));/*第一次用這個(gè)交為了防止結(jié)果允許為負(fù)數(shù)的情況,可以AC但是只是簡單的dp初始為0,也沒問題,個(gè)人感覺題目不是出的很嚴(yán)格for(int i = 1 ; i<= m ; i++)for(int j = cnt[i] ; j<=n ; j++)dp[i][j] = -INF;*/for(int i = 1 ; i<= m ; i++)for(int j = cnt[i] ; j<=n ; j++){dp[i][j] = max(dp[i-1][j-l[i]] + sum[j] - sum[j-l[i]] , dp[i][j-1]);}printf("%d\n" , dp[m][n]);}return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/CSU3901130321/p/4184591.html

總結(jié)

以上是生活随笔為你收集整理的HDU 1244 DP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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