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 见祖宗。

posted @ 2026-06-27 22:17  LZYXT  阅读(6)  评论(0)    收藏  举报