【每日一题】8月4日题目精讲—购物
來源:牛客網:
文章目錄
- 購物
- 題目描述
- 題解:
- 代碼:
購物
時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld題目描述
在遙遠的東方,有一家糖果專賣店。 這家糖果店將會在每天出售一些糖果,它每天都會生產出m個糖果,第i天的第j個糖果價格為C[i][j]元。
現在的你想要在接下來的n天去糖果店進行選購,你每天可以買多個糖果,也可以選擇不買糖果,但是最多買m個。(因為最多只生產m個)買來糖果以后,你可以選擇吃掉糖果或者留著之后再吃。糖果不會過期,你需要保證這n天中每天你都能吃到至少一個糖果。
這家店的老板看你經常去光顧這家店,感到非常生氣。(因為他不能好好睡覺了)于是他會額外的要求你支付點錢。具體來說,你在某一天購買了 k
個糖果,那么你在這一天需要額外支付 k2 的費用。 那么問題來了,你最少需要多少錢才能達成自己的目的呢?
輸入描述:
第一行兩個正整數n和m,分別表示天數以及糖果店每天生產的糖果數量。
接下來n行(第2行到第n+1行),每行m個正整數,第x+1行的第y個正整數表示第x天的第y個糖果的費用。
輸出描述:
輸出只有一個正整數,表示你需要支付的最小費用。
示例1
輸入
復制
輸出
復制
示例2
輸入
復制
輸出
復制
備注:
對于100%的數據,1 ≤ n, m ≤ 300 , 所有輸入的數均 ≤ 106。
題解:
根據題意,我們一天最少吃一個,那我們只需要買n個就行
dp[i][j]表示第i天總共買j個糖果的最低價格
枚舉第i天買了多少糖果
dp[i][j]=min(dp[i-1][j-k]+sum[i][k]+(k)*(k))
(k從0到j枚舉)
前i-1天買了j-k個糖果,第i天就買k個糖果
代碼:
#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; }總結
以上是生活随笔為你收集整理的【每日一题】8月4日题目精讲—购物的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (牛客网)树型dp
- 下一篇: 【每日一题】8月6日题目精讲—追债之旅