Educational Codeforces Round 109
Posted 20203246
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 109相关的知识,希望对你有一定的参考价值。
D题就是个搜索居然没有发现
题目大意:先输入一个数n,在输入n个数由0 1构成,从1到0的价值是它们下表差的绝对值,问将所有的1移动到0的最小价值总和是多少(1不能移动到前一个1移走的位置)。
题解:将输入的0和1分别用两个向量存它们的下标
贪心1向量中只能从对应0向量位置向右走深搜
先走到底记录下价值,然后回溯取最小值输出即可
#include <bits/stdc++.h> using namespace std; using ll = long long ; vector<ll>a,b; ///a 0 ///b 1 ll n,_ret,vis[5005][5005],ret[5005][5005],vid,x; ll dfs(int x,int y){ if(y == b.size())return 0; if(x == a.size())return 1e12; ll &_ret=ret[x][y]; if(vis[x][y] == vid) return _ret; vis[x][y]=vid; return _ret=min(dfs(x+1,y+1)+abs(a[x]-b[y]),dfs(x+1,y)); } int main() { ios::sync_with_stdio(false); cin>>n; for(int i=0;i<n;i++){ cin>>x; if(x)b.push_back(i); else a.push_back(i); } vid++; cout<<dfs(0,0); }
以上是关于Educational Codeforces Round 109的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 7 A
Educational Codeforces Round 7
Educational Codeforces Round 90
Educational Codeforces Round 33