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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【动态规划】 数字游戏 (ssl 1653)

發(fā)布時(shí)間:2023/12/3 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【动态规划】 数字游戏 (ssl 1653) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)字游戲

題目大意:

有n個(gè)數(shù),分別為a[1] (序號(hào)為1),a[2] (序號(hào)為2),a[3]…a[n],讓你選m個(gè)數(shù),每選一個(gè)數(shù),就要減去已選個(gè)數(shù)(不算當(dāng)前數(shù))*b[i] (i為當(dāng)前值的序號(hào)),所選數(shù)的最大值(要減去相應(yīng)的b)

原題

小W發(fā)明了一個(gè)游戲,他在黑板上寫出了一行數(shù)字a1,a2,a3,……,an,然后給你M個(gè)回合的機(jī)會(huì),每會(huì)回你可以從中選擇一個(gè)數(shù)字擦去它,接著剩下來的每個(gè)數(shù)字ai都要遞減一個(gè)值bi。如此重復(fù)m個(gè)回合,所有你擦去的數(shù)字之和就是你所得的分?jǐn)?shù)。

小W和他的好朋友小Y玩了這個(gè)游戲,可是他發(fā)現(xiàn),對(duì)于每個(gè)給出的a和b序列,小Y的得分總比他高,所以他就很不服氣。于是他想讓你幫他算算,對(duì)于每個(gè)a和b序列,可以得到的最大得分是多少。

Input

輸入文件的第一行是一個(gè)整數(shù)n(1<=n<=2000),表示數(shù)字個(gè)數(shù);第二行一個(gè)整數(shù)m(1<=m<=n),表示回合數(shù),接下來一行有n個(gè)不超過10000的正整數(shù),a1,a2,a3,……,an表示原始序列,最后一行有n個(gè)不超過500的正整數(shù),b1,b2,b3,……,bn,表示每回合每個(gè)數(shù)字遞減的值。

Output

輸出文件只有一個(gè)整數(shù),表示最大的可能得分

Sample Input

3

3

10 20 30

4 5 6

Sample Output

47

解題方法;

用二維數(shù)組來表示f[i] (前i個(gè)) [j](選j個(gè)),選的情況就是f[i-1][j-1]+a[i]-b[i]×(j-1),因?yàn)橹斑x了j-1個(gè)所以要減b[i]×(j-1),不選直接f[i-1][j],但這樣有可能還不是最優(yōu),所以我們要先按b從大到小排,這樣就可以使減去的盡可能小

動(dòng)態(tài)轉(zhuǎn)移方程:

f[i][j]=max{f[i?1][j]f[i?1][j?1]+a[i]?b[i]?(j?1){\color{Cyan} f[i][j]=max\left\{\begin{matrix}f[i-1][j]\\ f[i-1][j-1]+a[i]-b[i]*(j-1)\end{matrix}\right.}f[i][j]=max{f[i?1][j]f[i?1][j?1]+a[i]?b[i]?(j?1)?

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int n,m,f[2005][2005]; struct rec {int a,b;//為了方便排序,我們用結(jié)構(gòu)體 }l[2005]; bool cmp(rec l1,rec l2) {return l1.b>l2.b;//從大到小 } int main() {scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d",&l[i].a);for (int i=1;i<=n;i++)scanf("%d",&l[i].b);sort(l+1,l+1+n,cmp);//排序memset(f,-127/3,sizeof(f));//因?yàn)樗袦p去的所以可能是負(fù)數(shù),所以要先賦一個(gè)小值f[1][1]=l[1].a;//預(yù)處理for (int i=2;i<=n;i++)f[i][1]=max(l[i].a,f[i-1][1]);//選一個(gè)要是不選,就是前面的,要是選,只要當(dāng)前的for (int i=1;i<=n;i++)for (int j=2;j<=m;j++)f[i][j]=max(f[i-1][j],f[i-1][j-1]+l[i].a-l[i].b*(j-1));//動(dòng)態(tài)轉(zhuǎn)移方程printf("%d",f[n][m]);return 0; }

總結(jié)

以上是生活随笔為你收集整理的【动态规划】 数字游戏 (ssl 1653)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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