题目链接:题目
这也是一道神奇的dp题(写完之后发现都是用的dp),其实可以直接去用dp转移的思路去写一个非dp的代码, 只要是当前没有盖子的价值是大于与其相邻的连续的1中的某一个,那么那一个就可以转移过来,并且不会对之后的盒子产生任何影响,根据这个性质题就变的很简单。
题:
以下是ac代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 2e5 + 10;
typedef long long int LL ;
int a[N];
char b[N];
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n ;
cin >> b+ 1;
a[0] = a[n + 1] = 0 ;
b[0] = b[n + 1] = '0';
for(int i = 1; i <= n ; i ++)cin >> a[i];
bool f = false;
int pee = 0 ;
for(int i = 1; i <= n ; i ++)
{
if(b[i] == '0')
pee = i ;
else if(b[i] == '1')
{
int j = i;
while(j <= n && a[j] >= a[pee] && b[j] == '1')j ++ ;
if(j <= n && b[j] == '1')swap(b[j],b[pee]);
pee = j;
i = j;
}
}
int ans = 0 ;
for(int i = 1; i <= n ; i ++)if(b[i] == '1')ans += a[i];
cout << ans <<endl;
}
}