当前位置:   article > 正文

蓝桥杯day21刷题日记--接龙序列 动态规划

蓝桥杯day21刷题日记--接龙序列 动态规划

刚开始以为最长子序列的做法,然后发现数据太大了,只能得四十分,遂看题解,寻找AC做法

四十分做法

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;
  5. int dp[100010];
  6. int n;
  7. string s;
  8. int head[100010],tail[100010];
  9. int main()
  10. {
  11. cin>>n;
  12. int maxs=1;
  13. for(int i=1;i<=n;i++){
  14. cin>>s;
  15. head[i]=s[0]-'0';
  16. tail[i]=s[s.size()-1]-'0';
  17. }
  18. dp[1]=1;
  19. for(int i=2;i<=n;i++){
  20. for(int j=1;j<i;j++)
  21. if(head[i]==tail[j])
  22. dp[i]=max(dp[i],dp[j]+1);
  23. maxs=max(maxs,dp[i]);
  24. }
  25. cout<<n-maxs;
  26. return 0;
  27. }

AC做法 

核心就是一个数能否接龙是由它的自身第一个数字决定的,所以用dp[i]代表以i为结尾的数的最长接龙长度

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;
  5. int dp[20];
  6. int n;
  7. string s;
  8. int main()
  9. {
  10. cin>>n;
  11. for(int i=0;i<n;i++){
  12. cin>>s;
  13. dp[s.back()-'0']=max(dp[s.back()-'0'],dp[s.front()-'0']+1);
  14. }
  15. int maxs=-1e9;
  16. for(int i=0;i<10;i++) maxs=max(maxs,dp[i]);
  17. cout<<n-maxs;
  18. return 0;
  19. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/404955
推荐阅读
相关标签
  

闽ICP备14008679号