B(DP)
最も重要なことは、同じステージでの状態遷移の影響です。
01バックパックの最適化がフラッシュバックを必要とする理由と同じように、この質問はフラッシュバックだけでなく、この段階で転送を保存し、最終的に均一に保存することでもあります。
移管の同じ段階で相互影響を回避するには
もちろん、並べ替えについては、アップグレードしたい経験が多ければ多いほど良いと思います。
#include <bits / stdc ++。h> #define RE register #define P pair <int、int> #define PP pair <P、P> #define ll long long using using namespace std; int n、x、y; ll f [ 501 ] [ 501 ]、ff [ 501 ] [ 501 ]; PP a [ 501 ]; bool cmp(PP a、PP b) { return a.first.first < b.first.first; } int main() { scanf(" %d%d%d "、&n、&x、& y); memset(f、0x3f3f3f3f、sizeof f); memset(ff、0x3f3f3f3f、sizeof ff); llフラグ = f [ 0 ] [ 0 ]; f [ 0 ] [ 0 ] = 0 ; for(RE int i = 1 ; i <= n; ++ i) scanf(" %d%d%d%d "、&a [i] .first.first、&a [i] .first.second、&a [ i] .second.first、&a [i] .second.second); sort(a + 1、a + 1 + n、cmp); 以下のために(int型私は= 1 ; i <= n; ++ i) { for(int c = 0 ; c <= x; ++ c) for(int d = 0 ; d <= y; ++ d) ff [c] [d] = f [c] [ d]; for(int c = x; c> = 0 ; -c) for(int d = y; d> = 0 ; -d) { if(f [c] [d] == flag)continue ; もし(c!=x) { int nc = c + a [i] .first.first; int nd = d; if(nc> x)nd + = nc-x、nc = x; nd = min(nd、y); ff [nc] [nd] = min(ff [nc] [nd]、f [c] [d] + a [i] .first.second); } int nd = min(d + a [i] .second.first、y); ff [c] [nd] = min(ff [c] [nd]、f [c] [d] + a [i] .second.second); } for(int c = 0 ; c <= x; ++ c) for(int d = 0 ; d <= y; ++ d) f [c] [d] = ff [c] [d]; } if(f [x] [y] == flag)f [x] [y] = -1 ; printf(" %lld " 、f [x] [y]); 0を返し ます。 }
D(終了)
#include <bits / stdc ++。h> using namespace std; char s [ 1000005 ]; int a [ 26 ]、len = 1 、n; vector < int > ve; int main() { scanf(" %s "、s + 1 ); for(int&i = len; s [i]; ++ i)++ a [s [i]- ' a ' ]; --len; len >> = 1 ; for(int i = 0 ; i < 26; ++ i) if(a [i]> = len)ve.emplace_back(i)、++ n; else if(a [i])++ n; if(ve.size()> 1 ||(ve.size()== 1 && n < 3 )) { puts(" NO " ); 0を返し ます。 } puts(" YES " ); if(!ve.empty()) { a [ve [ 0 ]]-= len; for(int i =1 ; i <= len; ++ i)printf(" %c "、ve [ 0 ] + ' a ' ); for(int i = 0 ; i < 26 ; ++ i) if(a [i] && i!= ve [ 0 ]) {-- a [i]; printf(" %c "、' a ' + i); 休憩; } while(a [ve [ 0 ]]-)printf(" %c "、ve [ 0] + ' a ' ); } for(int i = 0 ; i < 26 ; ++ i) while(a [i]> 0)printf(" %c "、i + ' a ')、- a [i]; 0を返し ます。 }
F(木のトリミング、nim)
#include <bits / stdc ++。h> using namespace std; const int N = 1e5 + 5 ; vector < int > vec [N]; int n; int dfs(int u、int fa) { int re = 0 ; for(int i = 0 ; i <vec [u] .size(); ++ i) if(vec [u] [i]!= fa) re ^ = 1 + dfs(vec [u] [i]、 u); reを返す; } intmain() { scanf(" %d "、&n); for(int i = 1、a、b; i <n; ++ i) { scanf(" %d%d "、&a、&b); vec [a] .push_back(b); vec [b] .push_back(a); } のprintf(DFS(1、0)?" アリス":" ボブ" )。 0を返し ます。 }