AtCoder Beginner Contest 464 D-Celester 题解
这是一道很简单的DP水题
好久没做过这么简单的 TD 了
设 \(f_{i,0/1}\) 表示前 \(i\) 天,第 \(i\) 天天气为 \(R(1)\) 或 \(S(0)\) 时的最大快乐值
那么我们可以飞快的推出动态转移方程:
\[f_{i,0}=max(f_{i-1,0},f_{i-1}[1])-X_i \times [S_i为字符S]
\]
\[f_{i,1}=max(f_{i-1,0},f_{i-1}[1]+Y_{i-1})-X_i \times [S_i为字符R]
\]
时间复杂度为 \(O(Tn)\)
#include<bits/stdc++.h>
using namespace std;
const int NUM=2e5+10;
#define int long long
int T;
int n;string s;
int X[NUM],Y[NUM];
int f[NUM][2];
void work(){
cin>>n;cin>>s;s=' '+s;
for(int i=1;i<=n;++i){
cin>>X[i];
}
for(int i=1;i<n;++i){
cin>>Y[i];
}
memset(f,0,sizeof(f));
for(int i=1;i<=n;++i){
f[i][1]=max(f[i-1][0],f[i-1][1])-X[i]*(s[i]=='S');
f[i][0]=max(f[i-1][1]+Y[i-1],f[i-1][0])-X[i]*(s[i]=='R');
}
cout<<max(f[n][1],f[n][0])<<'\n';
}
signed main(){
cin>>T;
while(T--) work();
return 0;
}
十年OI一场空,不开 long long 见祖宗。

浙公网安备 33010602011771号