0
点赞
收藏
分享

微信扫一扫

G - String Fair(dp)


G - String Fair(dp)

考虑模式串长度不超过3。

且最后一个字符选择只与前两个字符选取情况有关。

可以定义状态

然后跑最长路dp。即问题转化为最长路。而且需要判正环。

用spfa即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
int n,cnt[27][27];
ll id1[27];
ll id2[27][27];
ll id3[27][27][27];
ll f[27][27],ans=-1e18;
bool ins[27][27];
queue<pii>que;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
char buf[4];scanf("%s%d",buf,&x);
int m=strlen(buf);
if(m==1)id1[buf[0]-'a']=x;
if(m==2)id2[buf[0]-'a'][buf[1]-'a']=x;
if(m==3)id3[buf[0]-'a'][buf[1]-'a'][buf[2]-'a']=x;
}
memset(f,0xc0,sizeof(f));
f[26][26]=0,que.push({26,26}),ins[26][26]=1;
while(!que.empty()){
auto[u,v]=que.front();que.pop(),ins[u][v]=0;
for(int c=0;c<26;c++){
ll w=f[u][v]+id1[c]+id2[v][c]+id3[u][v][c];
if(f[v][c]<w){
f[v][c]=w,cnt[v][c]=cnt[u][v]+1;
if(w>ans)ans=w;
if(cnt[v][c]>=n)return puts("Infinity"),0;
if(!ins[v][c])ins[v][c]=1,que.push({v,c});
}
}
}
printf("%lld",ans);
}


举报

相关推荐

0 条评论