牛客等級之題N1(8 4場) 購物 dp動態規劃

2022-07-21 19:09:13 字數 1793 閱讀 5281

在遙遠的東方,有一家糖果專賣店。

這家糖果店將會在每天**一些糖果,它每天都會生產出m個糖果,第i天的第j個糖果**為c[i][j]元。

現在的你想要在接下來的n天去糖果店進行選購,你每天可以買多個糖果,也可以選擇不買糖果,但是最多買m個。(因為最多隻生產m個)買來糖果以後,你可以選擇吃掉糖果或者留著之後再吃。糖果不會過期,你需要保證這n天中每天你都能吃到至少乙個糖果。

這家店的老闆看你經常去光顧這家店,感到非常生氣。(因為他不能好好睡覺了)於是他會額外的要求你支付點錢。具體來說,你在某一天購買了 k 個糖果,那麼你在這一天需要額外支付 k2的費用。

那麼問題來了,你最少需要多少錢才能達成自己的目的呢?

第一行兩個正整數n和m,分別表示天數以及糖果店每天生產的糖果數量。

接下來n行(第2行到第n+1行),每行m個正整數,第x+1行的第y個正整數表示第x天的第y個糖果的費用。

輸出只有乙個正整數,表示你需要支付的最小費用。
3 2 

1 1100 100

10000 10000

107

5 5

1 2 3 4 5

2 3 4 5 1

3 4 5 1 2

4 5 1 2 3

5 1 2 3 4

10

題意:輸入乙個n*m的**矩陣,表示第i天的第j個糖果的**,我們從中選取n個,**最低,輸出最低**,但是我們在一天購買k個糖果就要多交k*k元。

比如樣例1的第一天,我們買2個糖果,那就要多交4元,即6元買了2個糖果,第二天我們花101買1個糖果,合計107;此外我們還要保證每一天都要有糖果吃,即第一天是肯定必須要買的

題解:初看模擬貪心,直接找最少的值,後發現模擬不出來,他可以有很多個最少的值,我們要考慮哪天買幾個,這個就比較複雜了。然後才想到dp。

我們用dp[ i ][ j ]表示 第i天 買了j個糖果的最低**。k列舉第i天買了k個;

這裡的a[ i ][ j ]我們先預處理字首和,那樣直接加的是j-k個糖果的**。

轉移狀態 dp[ i ][ j ] =  min ( dp[ i ] [ j ] , dp [ i-1 ] [ k ] + a[ i ] [ j - k ] +( j-k )*( j-k ) )  

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include 

#define inf 0x3f3f3f3f

using

namespace

std;

typedef

long

long

ll;const

int maxn=300+7

;const ll mod =998244353

;int

t,n,m;

intma[maxn][maxn];

intdp[maxn][maxn];

intmain()

sort(ma[i]+1,ma[i]+m+1

);

for(int j=1;j<=m;j++)

}memset(dp,inf,

sizeof

(dp));

dp[0][0]=0

;

for(int i=1;i<=n;i++)

}printf(

"%d\n

",dp[n][n]);

return0;

}

牛客等級之題N1(8 4場)購物

題目鏈結 在遙遠的東方,有一家糖果專賣店。這家糖果店將會在每天 一些糖果,它每天都會生產出m個糖果,第i天的第j個糖果 為c i j 元。現在的你想要在接下來的n天去糖果店進行選購,你每天可以買多個糖果,也可以選擇不買糖果,但是最多買m個。因為最多隻生產m個 買來糖果以後,你可以選擇吃掉糖果或者留著...

牛客等級之題N2

目錄牛客等級之題n2 8.3場 設大半圓的半徑為 r 左小半圓半徑為 r r kr 0 pi r 2 pi k 2r 2 pi r kr 2 2s r 2 k k 2 frac k frac 時 r 2 最小 include using namespace std const double pi a...

牛客等級之題N1(8 13場)3的倍數

最容易想到的辦法是通過記錄每個字串中每個字母出現的次數,然後將所有n個字串進行各種組合,確定最多可選擇的字串數。但是這樣的複雜度為2的n次方,肯定不行。所以想到用類似於字首和的方式,遍歷所有字串過程中,判斷當前遍歷到的字串的狀態與之前某位置字串狀態是否相同。對於狀態而言,可以用狀壓來完成,實際上也就...