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。。。
但是我要睡觉

浙公网安备 33010602011771号