小x和他的朋友們在一起開心地喝酒,差不多喝完了,朋友們湊了k元錢讓小x去小賣部買酒。因為是老客戶,雖然每瓶酒的質量是不同的,不過小x買酒始終只需要1元一瓶。
小賣部的酒擺在商品貨架上,一共有n個擺著酒的貨架,每個貨架一開始都擺滿了m瓶酒,每瓶酒都有乙個自身的質量,可能千差萬別。對於每個貨架,小x每次只能拿貨架最外面的那瓶酒。
令小x感到開心的是,現在超市裡的這一批酒在搞「開蓋有獎」的活動,所以有一些酒買下來之後還可以再拿一瓶酒。
小x心想,反正不用擔心那一幫酒鬼朋友們能不能喝完,拿回去的酒總量越多越賺。於是他開心地買酒、開蓋兌獎拿酒,直到不能再拿酒了為止。
作為上帝視角的你對於每瓶酒有多少質量,以及哪些酒有獎勵都非常清楚,你能求出小x最多能帶多少質量的酒回去和他的朋友們一起喝嗎?
輸入包含不超過10組資料。
對於每組資料,第一行3個正整數,n,m,k(1<=n,m,k<=200),意義如上文所述。接下來有n行,每行m個正整數,第i行第j個數表示第i個貨架從外往里數第j瓶酒的質量為x(1<=x<=10000)。接下來乙個整數t(0<=t<=n*m),表示小賣部裡面總共有t個有獎的酒。接下來是t行,每行兩個整數x和y(1<=x<=n,1<=y<=m)描述乙個有獎的酒的位置,表示它位於第x個貨架從外往里數第y瓶。
每組資料之後有乙個空行。
輸入資料以三個用空格分開的0結束。
對於每組資料,輸出一行乙個正整數,表示小x能帶回去的酒的最大質量。
4 3 2136 5 9
2 5 5
4 5 1
3 5 8
12 2
0 0 0
思路:首先這道題很明顯有很多子狀態,那麼我們容易想到dp,我們首先嘗試定義狀態,這題與01揹包相似,我們容易想到,定義狀態dp[i][j],i代表前i行,j代表用了j錢,dp值為當前狀態所獲取的最大值,之後我們可以想到把所有的每一行連續的中獎的質量之和求出來,對於這些,我們不用考慮因為這些相當於都是白送的,然後把這些非起點的有獎的與下乙個的做字首和處理,為什麼呢,對於當前行,我們如果能拿乙個有獎的我們就繼續拿直到沒有獎為止,這些相當於都是白送的,那麼我們在轉移狀態的時候直接就去加上這些免費的,然後對於這道題。每一行相當於i,都有m個物品,那麼我們可以根據記錄前i個物品的值去轉移狀態,但是上述做法是有漏洞的,上述做法,如果當我們取到乙個物品是沒有獎的時候,而且是沒有錢了時候,並且下乙個物品是有獎的,那麼按照上述做法,我們依然會去選擇這個有獎的,實際上是不行的,之後我們可以發現,當錢一定是可以用完的並且是剛好有剩下酒的時候,那麼我們有一行的選擇一定是剛好選到乙個沒有獎的,並且這個物品是這一行的終點,那麼我們就考慮重新定義狀態,dp[i][j][0|1],對於0,1,分別代表了,前i行有沒有考慮這特殊的一行,然後就是狀態轉移了,怎麼去轉移呢,這又是個難點,我們仔細去想,可以發現,dp[i][j][1]有兩種轉移的方式,一種是由前一行沒有考慮這乙個特殊行的轉移過來,一種是由已經考慮過了,按照沒有考慮的方式轉移,注意,0和1的初始化設定是不一樣的,對於1狀態,要初始化為負無窮,為什麼呢,因為只有這樣才能保證是經過第一種轉移過來以後,才能經過第二種轉移過來
**#include#include#include#include#include#include#include#define inf 0x3f3f3f3f
using namespace std;
int dp[205][205][2];
int a[205][205];
int give[205][205];
int pre_sum[205][205];
int sta[205];
int n,m,money;
int main()
}for(int i = 1 ;i <= n ;i++)
}int t;
scanf("%d",&t);
while(t--)
memset(sta,0,sizeof(sta));
memset(pre_sum,0,sizeof(pre_sum));
int ans = 0;
for(int i = 1;i <= n;i++)
for(int j = m ;j >= 1;j--)
}for(int i = 1; i<=n;i++)}}
}if(dp[n][money][1]+ans<0)
cout<
191 煎餅排序
題目描述 給定陣列 a,我們可以對其進行煎餅翻 我們選擇一些正整數 k a.length,然後反轉 a 的前 k 個元素的順序。我們要執行零次或多次煎餅翻轉 按順序一次接一次地進行 以完成對陣列 a 的排序。返回能使 a 排序的煎餅翻轉操作所對應的 k 值序列。任何將陣列排序且翻轉次數在 10 a....
LeetCode191 統計詞頻
寫乙個 bash 指令碼以統計乙個文字檔案 words.txt 中每個單詞出現的頻率。為了簡單起見,你可以假設 words.txt只包括小寫字母和 每個單詞只由小寫字母組成。單詞間由乙個或多個空格字元分隔。示例 假設 words.txt 內容如下 dayis sunny the thethe sun...
第191場周賽
class solution return res 這裡有個注意的點,maxh maxw這兩個int的值的乘積會超過int的範圍,所以要先轉換為double class solution maxh maxh h horizontalcuts hcut 1 maxh h horizontalcuts ...