20210324AtCoder刷题
AGC031 B - Reversi
-
题意:
给定长度为n的数字序列,每两个相等的数字可以将其之间的所有数字染色成与之相等的颜色,问:会出现多少种数字序列。 -
思路:
考虑DP:
状态表示:
f[i] 表示前面长度为i的序列一共的方案数
状态转移:
若i前面有与i相等的数(他可以进行染色,产生更多的方案)并且他前面的数与他不相等(相等就没有统计的必要了,这样不会改变方案数,而且前面的与之相等的数会与更前面可以更新的位置进行统计,若这个数再多此一举就会出现重复统计):f[i]=f[i-1]+f[pre[i]]
否则:f[i]=f[i-1] -
Code:
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define maxn 200005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline int read()
{
int x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
ll n,c[maxn],f[maxn],pre[maxn],a[maxn];
ll mod = 1e9+7;
int main()
{
//freopen("t1.in","r",stdin);
n=read();
rep(i,1,n) c[i]=read(),pre[i]=a[c[i]],a[c[i]]=i;
f[1]=1;
rep(i,2,n)
{
if(pre[i]>0 && c[i]!=c[i-1]) f[i]=(f[pre[i]]+f[i-1])%mod;
else f[i]=f[i-1];
}
printf("%lld\n",f[n]);
return 0;
}
AGC005 A - STring
-
题意:
给定一个由ST组成的字符串,一个一个的删除所有的‘ST’ -
思路:
用栈实现:S进栈,T出栈 -
Code:
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline int read()
{
int x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
char s[maxn];
int t[maxn],p=0;
int main()
{
//freopen("t1.in","r",stdin);
scanf("%s",s);
int l=strlen(s);
rep(i,0,l-1){
if(s[i]=='S') t[++p]=1;
else if(s[i]=='T' && t[p]==1) p--;
else if(t[p]==-1 || p<=0) t[++p]=-1;
}
printf("%d\n",p);
return 0;
}

浙公网安备 33010602011771号