Re: [閒聊] 每日leetcode

看板Marginalman作者 (是oin的說)時間1年前 (2024/08/17 14:53), 編輯推噓0(001)
留言1則, 1人參與, 1年前最新討論串728/1548 (看更多)
※ 引述 《dont (dont)》 之銘言: :   : 1937. Maximum Number of Points with Cost :   : ## 思路 :   : 直接照題目暴力作DP的話 會TLE -- O(MN^2) :   題目: 有一個二維陣列 你要從每一排拿一個元素 然後要減掉他們index的距離 就是往下掉拿數字的意思 不過可以選任何地方掉 代價是扣掉距離 思路: 暴力會超時 這題暴力會超時的原因是 m*n*n會超久 主要是那個n平方在搞 然後如果直接看下一步去哪裡的全部選擇的話 就是n平方 所以主要就要想去哪裡的選擇的方法 怎麼改 我覺得他每日出的還不錯 這就是昨天那個找前面的最大值 套用在這邊 說的意思就是不用找全部可能 只要找上面的 左邊最大可能 右邊最大可能 跟正上比就好 然後dp下來 姆咪姆咪 ```cpp class Solution { public: long long maxPoints(vector<vector<int>>& points) { int n = points[0].size(); int m = points.size(); vector<vector<long long>> paper(m,vector<long long>(n)); for(int i = 0 ; i < m ; i ++) { for(int j = 0 ; j < n ; j ++) { paper[i][j] = (long long)points[i][j]; } } long long res =0; for(int i = 1 ; i < m ; i ++) { long long pre = 0; for(int j = 0 ; j < n ; j ++) { pre--; paper[i][j] = max(max(paper[i-1][j] + points[i][j],pre + points[ i][j]),paper[i][j]); pre = max(paper[i-1][j] , pre); } pre = 0; for(int j = n-1 ; j >= 0 ; j --) { pre--; paper[i][j] = max(max(paper[i-1][j] + points[i][j],pre + points[ i][j]),paper[i][j]); pre = max(paper[i-1][j] , pre); } } for(int i = 0 ; i < n ; i ++) { res = max(res ,paper[m-1][i]); } // for(int i = 0 ; i < m ; i ++) // { // for(int j = 0 ; j < n ; j ++) // { // cout<<paper[i][j]<<" "; // } // cout<<endl; // } // cout<<endl; return res; } }; ``` -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.162.41.248 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1723877614.A.9F9.html

08/17 14:53, 1年前 , 1F
你有什麼用
08/17 14:53, 1F
文章代碼(AID): #1cm4Zkdv (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1cm4Zkdv (Marginalman)