日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客假日团队赛5 K金币馅饼 (DP 基础题)

發布時間:2023/12/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客假日团队赛5 K金币馅饼 (DP 基础题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:https://ac.nowcoder.com/acm/contest/984/K
來源:牛客網

金幣餡餅
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
題目描述
最近,奶牛們熱衷于把金幣包在面粉里,然后把它們烤成餡餅。第i塊餡餅中含有Ni(1<=Ni<=25)塊金幣,并且,這個數字被醒目地標記在餡餅表面。
奶牛們把所有烤好的餡餅在草地上排成了一個R行(1<=R<=100)C列(1<=C<=100)的矩陣。你現在站在坐標為(1,1)的餡餅邊上,當然,你可以拿到那塊餡餅里的所有金幣。你必須從現在的位置,走到草地的另一邊,在坐標為(R,C)的餡餅旁邊停止走動。每做一次移動,你必須走到下一列的某塊餡餅旁邊,并且,行數的變動不能超過1(也就是說,如果現在你站在坐標為(r,c)的餡餅邊上,下一步你可以走到坐標為(r-1,c+1),(r,c+1),或者(r+1,c+1)的餡餅旁邊)。當你從一塊餡餅邊經過,你就可以拿走餡餅里所有的金幣。當然啦,你一定不會愿意因半路離開草地而失去唾手可得的金幣,但,最終你一定得停在坐標為(R,C)的餡餅旁邊。
現在,你拿到了一張標記著餡餅矩陣中,每一塊餡餅含金幣數量的表格。那么,按照規則,你最多可以拿到多少金幣呢?
比方說,奶牛們把餡餅排成如下的矩陣,矩陣中的數字表示該位置的餡餅中含金幣的數量:

起點-> 6 5 3 7 9 2 7
2 4 3 5 6 8 6
4 9 9 9 1 5 8 <-終點
以下是一條合法的路線:

起點-> 6 5 3 7 9 2 7
2 4 3 5 6 8 6
? / 4 9 9-9 1 5-8 <-終點
按上述的路線進行走動,一共可以獲得6+4+9+9+6+5+8=47個金幣。按照規則,在這個矩陣中最多可以得到50個金幣,路線如下圖所示:

起點-> 6 5 3 7 9 2 7
2 4 3 5 6-8 6
? / 4 9 9-9 1 5 8 <-終點
(請復制到記事本中用等寬字體查看)

輸入描述:
第1行: 兩個用空格隔開的整數,R和C
第2..R+1行: 每行包含C個用空格隔開的正整數,依次表示一行中從左往右各個餡餅里金幣的數量
輸出描述:
第1行: 輸出一個正整數,表示你所能收集到的最大金幣數目
示例1
輸入
復制
3 7
6 5 3 7 9 2 7
2 4 3 5 6 8 6
4 9 9 9 1 5 8
輸出
復制
50

思路:
直接二維DP 嘛,每一個位置可能由最多3個位置轉移過來,還需要注意一下有些位置是沒法訪問到的,比如第一列,只有1,1這個位置可以訪問,其他均無法到達,轉移的時候需要判斷一下。

細節見代碼:

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <iomanip> #define ALL(x) (x).begin(), (x).end() #define rt return #define dll(x) scanf("%I64d",&x) #define xll(x) printf("%I64d\n",x) #define sz(a) int(a.size()) #define all(a) a.begin(), a.end() #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define pii pair<int,int> #define pll pair<long long ,long long> #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define MS0(X) memset((X), 0, sizeof((X))) #define MSC0(X) memset((X), '\0', sizeof((X))) #define pb push_back #define mp make_pair #define fi first #define se second #define eps 1e-6 #define gg(x) getInt(&x) #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl using namespace std; typedef long long ll; ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;} ll lcm(ll a, ll b) {return a / gcd(a, b) * b;} ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;} inline void getInt(int* p); const int maxn = 1000010; const int inf = 0x3f3f3f3f; /*** TEMPLATE CODE * * STARTS HERE ***/ int dp[105][105]; int a[105][105]; int n,m; int main() {//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);gbtb;cin>>n>>m;repd(i,1,n){repd(j,1,m){cin>>a[i][j];}}memset(dp,-1,sizeof(dp));dp[1][1]=a[1][1];repd(j,2,m){repd(i,1,n){if(dp[i][j-1]!=-1)dp[i][j]=max(dp[i][j],dp[i][j-1]+a[i][j]);if(dp[i+1][j-1]!=-1)dp[i][j]=max(dp[i][j],dp[i+1][j-1]+a[i][j]);if(dp[i-1][j-1]!=-1)dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i][j]);}}dp[n][m]=max(dp[n][m],0);cout<<dp[n][m]<<endl;return 0; }inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}} }

轉載于:https://www.cnblogs.com/qieqiemin/p/11253225.html

總結

以上是生活随笔為你收集整理的牛客假日团队赛5 K金币馅饼 (DP 基础题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。