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 语法树、动态规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bushi是什么梗 bushi是什么意思
- 下一篇: 嬴政的父亲是吕不韦吗 嬴政的父亲是谁呢