AtCoder Beginner Contest 464 D - Celester 题解

update

  • 发现最重要的状态设计没写,加急补上

大家都能拿下呢

solve

  • 任意次操作,操作任意,求最大值,那说啥了直接考虑dp
    • 其实dp很好想,决策多,搜会炸,所以dp
  • 设计状态,\(f[i][j]\)为第i天天气为0/1时的最大答案
  • 转移方程搓一下
    \(f[i][0]= \begin{cases} s[i] == 'R':max(f[i-1][0],f[i-1][1])\\ s[i] == 'S':max(f[i-1][0],f[i-1][1])-x[i] \end{cases}\)
    \(f[i][1]= \begin{cases} s[i] == 'R':max(f[i-1][0]+y[i-1],f[i-1][1])-x[i]\\ s[i] == 'S':max(f[i-1][0]+y[i-1],f[i-1][1]) \end{cases}\)
  • 敲得不一定对喵
  • 最后的转移是printf("%lld\n",max(f[n][0],f[n][1]));
  • 枚举搞1.0
  • 好像被卡了喵
  • 枚举搞2.0
  • 火车头也没过呢
  • 我真要认真优化了,发现有许多没必要清空,比如string,x[],y[],且f只用f[0][0]=f[0][1]=0;
  • 然后过了
  • A4题给msjing高兴坏了

code

#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=5e5+10;
long long read()
{
	long long x=0,f=1;
	char ch=getchar();
	while (ch<'0' || ch>'9')
	{
		if (ch == '-') f=-1;
		ch=getchar();
	}
	while (ch>='0' && ch<='9')
	{
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
long long n;
string s;
long long d[maxn];
long long x[maxn],y[maxn];
long long f[maxn][2];
int main()
{
	long long T=read();
	while (T--)
	{
//		s.clear();
//		memset(x,0,sizeof(x));memset(y,0,sizeof(y));
//		memset(f,0,sizeof(f));
		f[0][0]=f[0][1]=0;
		n=read();cin >> s;s=" "+s;
//		for (long long i=1;i<=s.size();i++) {if (s[i] == 'S') d[i]=1;else d[i]=0;}
		for (long long i=1;i<=n;i++) x[i]=read();
		for (long long i=1;i<n;i++) y[i]=read();
		for (long long i=1;i<=n;i++)
		{
			for (long long j=0;j<=1;j++)
			{
				if (!j)
				{
					if (s[i] == 'R') f[i][j]=max(f[i-1][0],f[i-1][1]);
					else f[i][j]=max(f[i-1][0],f[i-1][1])-x[i];
				}
				else
				{
					if (s[i] == 'R') f[i][j]=max(f[i-1][0]+y[i-1],f[i-1][1])-x[i];
					else f[i][j]=max(f[i-1][0]+y[i-1],f[i-1][1]);
				}
			}
		}
		printf("%lld\n",max(f[n][0],f[n][1]));
//		puts("---------------");
	}
	
	return 0;
}

msjing加急改Eing。。。
但是我要睡觉

posted @ 2026-06-27 22:11  msjing  阅读(19)  评论(0)    收藏  举报