Hard problem T15 D57
2021/10/7 6:13:03
本文主要是介绍Hard problem T15 D57,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Hard problem T15 D57
[传送门]( Problem - C - Codeforces (Unofficial mirror site, accelerated for Chinese users) )
思路
dp
\(f[i][0]\)表示到这个字符串时不反转的最小代价
\(f[i][1]\)表示到这个字符串时反转的最小代价
参考代码
#include<bits/stdc++.h> #define ll long long #define pb push_back #define si size() using namespace std; ll read(){ll 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^48);ch=getchar();}return x*f;} inline void Prin(ll x){if(x < 0){putchar('-');x = -x;}if(x > 9) Prin(x / 10);putchar(x % 10 + '0');} const int qs=1e5+7; ll a[qs],f[qs][2],n; string s[qs],rs[qs]; int main(){ n=read(); for(int i=1;i<=n;++i) a[i]=read(); for(int i=1;i<=n;++i) { cin>>s[i]; rs[i]=s[i]; f[i][0]=f[i][1]=1e16; reverse(rs[i].begin(),rs[i].end()); } f[1][0]=0,f[1][1]=a[1]; for(int i=2;i<=n;++i){ int fg=0; if(s[i]>=s[i-1]&&f[i-1][0]!=1e16) fg=1,f[i][0]=min(f[i][0],f[i-1][0]); if(s[i]>=rs[i-1]&&f[i-1][1]!=1e16) fg=1,f[i][0]=min(f[i][0],f[i-1][1]); if(rs[i]>=s[i-1]&&f[i-1][0]!=1e16) fg=1,f[i][1]=min(f[i][1],f[i-1][0]+a[i]); if(rs[i]>=rs[i-1]&&f[i-1][1]!=1e16) fg=1,f[i][1]=min(f[i][1],f[i-1][1]+a[i]); if(!fg){ cout<<"-1\n"; return 0; } } cout<<min(f[n][0],f[n][1])<<"\n"; return 0; }
这篇关于Hard problem T15 D57的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)