ABC.E-DP题目集锦
ABC266E. Throwing the Die
题意:有
设
{% note success code: %}
#include<bits/stdc++.h>
using namespace std;
long double g[110];
int main() {
int n;
cin>>n;
g[1]=3.5;
for(int i=2;i<=n;i++)
for(int j=1;j<=6;j++)
g[i]+=max((long double)j,g[i-1])/6;
printf("%.7Lf\n",g[n]);
return 0;
}
{% endnote %}
ABC265E. Warp
题意:平面直角坐标系,一开始你在
由于在每一层中
{% note success code: %}
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int x[3],y[3];
int f[310][310];
pair<int,int> t[100010];
set<pair<int,int> > s;
int main() {
int n,m;
cin>>n>>m;
for(int i=0;i<3;i++)
cin>>x[i]>>y[i];
for(int i=1;i<=m;i++) {
cin>>t[i].first>>t[i].second;
s.insert(t[i]);
}
f[0][0]=1;
for(int len=1;len<=n;len++) {
for(int i=len;i>=0;i--)
for(int j=len-i;j>=0;j--) {
int k=len-i-j;
int nowx=i*x[0]+j*x[1]+k*x[2];
int nowy=i*y[0]+j*y[1]+k*y[2];
auto tmp=s.lower_bound(make_pair(nowx,nowy));
if(tmp!=s.end()&&(*tmp)==make_pair(nowx,nowy)) f[i][j]=0;
else {
if(i>0) (f[i][j]+=f[i-1][j])%=mod;
if(j>0) (f[i][j]+=f[i][j-1])%=mod;
}
}
}
int ans=0;
for(int i=0;i<=n;i++)
for(int j=0;j<=n-i;j++)
(ans+=f[i][j])%=mod;
cout<<ans<<endl;
return 0;
}
{% endnote %}
ABC263E. Sugoroku 3
题意:有
{% note success code: %}
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int a[200010],inv[200010];
int f[200010],suf[200010];
int main() {
int n;
cin>>n;
inv[1]=1;
for(int i=2;i<=n;++i)
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int i=1;i<n;i++)
cin>>a[i];
f[n]=suf[n]=0;
for(int i=n-1;i>0;i--) {
int x=(suf[i+1]-suf[i+a[i]+1]+1+mod)%mod;
f[i]=(1ll*x*inv[a[i]]+1)%mod;
suf[i]=(suf[i+1]+f[i])%mod;
}
cout<<f[1]<<endl;
return 0;
}
{% endnote %}
ABC253E. Distance Sequence
题意:问有多少个序列
可以使用前缀和维护。
{% note success code %}
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n,m,k,f[1010][5010];
int s[5010];
int main() {
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
f[1][i]=1,s[i]=(s[i-1]+f[1][i])%mod;
for(int i=2;i<=n;i++) {
for(int j=1;j<=m;j++) {
f[i][j]=((s[max(j-k,0)]+s[m])%mod-s[min(j+k-1,m)]+mod)%mod;
if(!k) f[i][j]=(f[i][j]-f[i-1][j]+mod)%mod;
}
for(int j=1;j<=m;j++)
s[j]=(s[j-1]+f[i][j])%mod;
}
cout<<s[m]<<endl;
return 0;
}
{% endnote %}
ABC251E. Takahashi and Animals
题意:有
{% note success code %}
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[600010],f[600010][2][2];
signed main() {
int n,ans=1e18;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
f[1][1][1]=a[1],f[1][0][0]=0;
f[1][1][0]=f[1][0][1]=1e18;
for(int i=2;i<=n;i++) {
for(int j=0;j<=1;j++) {
f[i][j][1]=min(f[i-1][j][0],f[i-1][j][1])+a[i];
f[i][j][0]=f[i-1][j][1];
}
}
cout<<min({f[n][1][0],f[n][0][1],f[n][1][1]})<<endl;
return 0;
}
{% endnote %}
ABC249E. RLE
对于一个小写字母组成的字符串
转化一下求和方式:
其中第二个
{% note success code %}
{% endnote %}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步