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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

codeforces 935E Fafa and Ancient Mathematics 语法树、动态规划

發布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces 935E Fafa and Ancient Mathematics 语法树、动态规划 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題解

一道很有意思的題目,同時把動態規劃和語法樹結合起來,很有新意,思路我是想出來了,但是我的寫法較為麻煩,從別人的submission中找了一個寫起來簡介的代碼分享給大家。
看到表達式的形式,我們可以想到使用語法樹來解決,題目中限定了+號和-號的使用數目。但是對于一個節點來說,我們并不知道左子樹中有多少個+號和-號,也不知道右子樹中有多少個+號和-號。所以,就需要使用動態規劃了。
對于每一可子樹,用一個vector <pair<int,int> > vec ,vec[i]來表示該子樹使用I個+號時候,表達式計算得到的最大、最小值。
遞推方法:
對于一個節點,計算該節點的vec[t]vec[t]:
1.當該節點采取+號時候,左子樹采取ll個+號,那么右子樹應該采取t?l?1t?l?1個加號,
vec[t].first=max(vec[t].first,leftv[l].first+rightv[t?l?1].first);vec[t].first=max(vec[t].first,leftv[l].first+rightv[t?l?1].first);
vec[t].second=min(vec[t].second,leftv[l].second+rightv[t?l?1].second);vec[t].second=min(vec[t].second,leftv[l].second+rightv[t?l?1].second);
2.當該節點采取-號的時候左子樹采取ll個加號,右子樹采取t?lt?l個加號,
vec[t].first=max(vec[t].first,leftv[l].first?rightv[t?l].second);vec[t].first=max(vec[t].first,leftv[l].first?rightv[t?l].second);
vec[t].second=min(vec[t].second,leftv[l].second?rightv[t?l].first);vec[t].second=min(vec[t].second,leftv[l].second?rightv[t?l].first);
最后注意不要越界,加入越界檢測


代碼

#include <iostream> #include <cstdio> #include <vector> using namespace std; const int inf = 1e7; typedef vector<pair<int,int> >vii; const int maxn = 1e4+7; char str[maxn]; int pos; vii expr(){char c = str[pos];if(c >= '0' && c <= '9'){++pos;vii v;v.push_back(make_pair(c-'0',c-'0'));return v;}++pos;vii v1 = expr();++pos;vii v2 = expr();++pos;int n1 = v1.size(),n2 = v2.size(),nn = n1+n2;vii res;for(int i = 0;i < nn;++i) res.push_back(make_pair(-inf,inf));//使用-號for(int i = 0;i < nn-1;++i){for(int j = 0;j <= min(i,n1-1);++j){if(i-j >= n2) continue;res[i].first = max(res[i].first,v1[j].first-v2[i-j].second);res[i].second = min(res[i].second,v1[j].second-v2[i-j].first);}}//使用+號for(int i = 0;i < nn;++i){for(int j = 0;j < min(i,n1);++j){if(i-j-1 >= n2) continue;res[i].first = max(res[i].first,v1[j].first+v2[i-j-1].first);res[i].second = min(res[i].second,v1[j].second+v2[i-j-1].second);} }return res; } int main(){int P,M;cin>>str>>P>>M;vii v = expr();cout<<v[P].first<<endl;return 0; }

總結

以上是生活随笔為你收集整理的codeforces 935E Fafa and Ancient Mathematics 语法树、动态规划的全部內容,希望文章能夠幫你解決所遇到的問題。

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