PAT甲级1045 Favorite Color Stripe (30 分) 效率最高的动态规划解法

这道题另有DFS、LCS、LIS的解法。这里的解法是动态规划,优点是读一遍输入同时就能处理好,所以非常高效。

核心思想就是【当前】珠子组成手链的最大长度【等于】以这个珠子能接上【以前最长】的某条手链的长度【加一】。

  1. #include<iostream>
  2. using namespace std;
  3. int n,m,x,maxs,maxp;//默认maxp指的是多个maxs中最大的位置
  4. int pf[205],l[205];//pf存放喜爱颜色的次序,0是不喜欢;l存放以第i个次序的颜色结尾的最大的手链长度
  5. void find(int p){
  6. if(p==0)return;//是不喜欢的颜色
  7. if(p>=maxp){//此颜色次序可排在目前最长的链子末端的颜色的后面
  8. maxs++;
  9. l[p]=maxs;
  10. maxp=p;
  11. }else{
  12. if(l[p]!=0){//此颜色曾经用过,直接调取之前的长度计算
  13. l[p]++;
  14. if(p>maxs){
  15. maxs=p;
  16. maxp=p;
  17. }
  18. return;
  19. }
  20. for(int j=p;j>0;j--){
  21. if(l[j]!=0){//此颜色次序之前的颜色出现过
  22. l[p]=l[j]+1;
  23. break;
  24. }
  25. }
  26. if(l[p]==0)l[p]=1;//此颜色及其前序颜色没有用过
  27. }
  28. }
  29. int main(){
  30. scanf("%d\n%d",&n,&m);
  31. for(int i=1;i<=m;i++){
  32. scanf("%d",&x);
  33. pf[x]=i;
  34. }
  35. scanf("%d",&m);
  36. for(int i=0;i<m;i++){
  37. scanf("%d",&x);
  38. find(pf[x]);
  39. }
  40. printf("%d\n",maxs);
  41. return 0;
  42. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsbGlzb25zaGluZw_size_16_color_FFFFFF_t_70

https://www.liuchuo.net/archives/2283

上面给的解法属于更常规的解法,最后两个测试点的时间长一些,也是非常好的,对考试完全够用了:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FsbGlzb25zaGluZw_size_16_color_FFFFFF_t_70 1

给出一个我自用的测试点,用来过测试点2(模拟全是不喜欢的颜色,6分):

  1. 6
  2. 5 1 2 3 4 5
  3. 3 6 6 6

发表评论

表情:
评论列表 (有 0 条评论,49人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PAT甲级1030 Travel Plan (30)

    题解: 题目大意是告诉你每个城市间的距离和开销,让你求出从起点到终点的最短距离,然后如果距离相同的话要最小开销,最后输出这条最短的路径、最小距离和最小开销 思路: