在遙遠的東方,有一家糖果專賣店。
這家糖果店將會在每天**一些糖果,它每天都會生產出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 21 1100 100
10000 10000
107
5 51 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次方,肯定不行。所以想到用類似於字首和的方式,遍歷所有字串過程中,判斷當前遍歷到的字串的狀態與之前某位置字串狀態是否相同。對於狀態而言,可以用狀壓來完成,實際上也就...