【每日一题】8月4日题目精讲—购物
來源:牛客網(wǎng):
文章目錄
- 購(gòu)物
- 題目描述
- 題解:
- 代碼:
購(gòu)物
時(shí)間限制:C/C++ 1秒,其他語(yǔ)言2秒 空間限制:C/C++ 32768K,其他語(yǔ)言65536K 64bit IO Format: %lld題目描述
在遙遠(yuǎn)的東方,有一家糖果專賣店。 這家糖果店將會(huì)在每天出售一些糖果,它每天都會(huì)生產(chǎn)出m個(gè)糖果,第i天的第j個(gè)糖果價(jià)格為C[i][j]元。
現(xiàn)在的你想要在接下來的n天去糖果店進(jìn)行選購(gòu),你每天可以買多個(gè)糖果,也可以選擇不買糖果,但是最多買m個(gè)。(因?yàn)樽疃嘀簧a(chǎn)m個(gè))買來糖果以后,你可以選擇吃掉糖果或者留著之后再吃。糖果不會(huì)過期,你需要保證這n天中每天你都能吃到至少一個(gè)糖果。
這家店的老板看你經(jīng)常去光顧這家店,感到非常生氣。(因?yàn)樗荒芎煤盟X了)于是他會(huì)額外的要求你支付點(diǎn)錢。具體來說,你在某一天購(gòu)買了 k
個(gè)糖果,那么你在這一天需要額外支付 k2 的費(fèi)用。 那么問題來了,你最少需要多少錢才能達(dá)成自己的目的呢?
輸入描述:
第一行兩個(gè)正整數(shù)n和m,分別表示天數(shù)以及糖果店每天生產(chǎn)的糖果數(shù)量。
接下來n行(第2行到第n+1行),每行m個(gè)正整數(shù),第x+1行的第y個(gè)正整數(shù)表示第x天的第y個(gè)糖果的費(fèi)用。
輸出描述:
輸出只有一個(gè)正整數(shù),表示你需要支付的最小費(fèi)用。
示例1
輸入
復(fù)制
輸出
復(fù)制
示例2
輸入
復(fù)制
輸出
復(fù)制
備注:
對(duì)于100%的數(shù)據(jù),1 ≤ n, m ≤ 300 , 所有輸入的數(shù)均 ≤ 106。
題解:
根據(jù)題意,我們一天最少吃一個(gè),那我們只需要買n個(gè)就行
dp[i][j]表示第i天總共買j個(gè)糖果的最低價(jià)格
枚舉第i天買了多少糖果
dp[i][j]=min(dp[i-1][j-k]+sum[i][k]+(k)*(k))
(k從0到j(luò)枚舉)
前i-1天買了j-k個(gè)糖果,第i天就買k個(gè)糖果
代碼:
#include <bits/stdc++.h> #define inf 0x3f3f3f3f typedef long long ll; using namespace std; int a[550][550]; ll sum[550][550],f[550][550],n,m; int main() {memset(f,0x3f,sizeof f);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cin>>a[i][j];sort(a[i]+1,a[i]+1+m);for(int j=1;j<=m;j++)sum[i][j]=sum[i][j-1]+a[i][j];}f[0][0]=0;for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)for(int k=0;k<=j&&k<=m;k++)if(f[i-1][j-k]!=0x3f3f3f3f)f[i][j]=min(f[i][j],f[i-1][j-k]+sum[i][k]+k*k);cout<<f[n][n]<<endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的【每日一题】8月4日题目精讲—购物的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (牛客网)树型dp
- 下一篇: 【每日一题】8月6日题目精讲—追债之旅