鱼C论坛

 找回密码
 立即注册
查看: 1392|回复: 0

[技术交流] PTA A_1045 Favorite Color Stripe

[复制链接]
发表于 2020-2-27 17:11:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 798236606 于 2020-2-27 17:11 编辑

传送门:https://pintia.cn/problem-sets/9 ... /994805437411475456

解:
动态规划
1.最长不下降子序列(LIS)
  1. #include <cstdio>
  2. #include <cstring>

  3. int n, m, l;
  4. int order[205];
  5. int list[10010];
  6. int dp[10010];

  7. int main(void)
  8. {
  9.     freopen("input.txt", "r", stdin);
  10.     scanf("%d %d", &n, &m);

  11.     memset(order, -1, sizeof(order));

  12.     for (int i = 0; i < m; i++)
  13.     {
  14.         int a;

  15.         scanf("%d", &a);
  16.         order[a] = i;
  17.     }

  18.     scanf("%d", &l);

  19.     int num = 0;
  20.     while (l--)
  21.     {
  22.         int a;

  23.         scanf("%d", &a);
  24.         if (order[a] != -1) list[num++] = order[a];
  25.     }

  26.     int ans = -1;   
  27.     for (int i = 0; i < num; i++)
  28.     {
  29.         dp[i] = 1;

  30.         for (int j = 0; j < i; j++)
  31.             if (list[j] <= list[i] && dp[j] + 1 > dp[i]) dp[i] = dp[j] + 1;
  32.         
  33.         if (dp[i] > ans) ans = dp[i];
  34.     }
  35.         
  36.     printf("%d", ans);

  37.     return 0;
  38. }
复制代码

2.最长公共子序列(LCS)可重复版
  1. #include <cstdio>
  2. #include <algorithm>

  3. using namespace std;

  4. int n, m, l;
  5. int order[205];
  6. int list[10010];
  7. int dp[205][10010];

  8. int main(void)
  9. {
  10.     // freopen("input.txt", "r", stdin);
  11.     scanf("%d %d", &n, &m);
  12.     for (int i = 1; i <= m; i++)
  13.         scanf("%d", order + i);

  14.     scanf("%d", &l);
  15.     for (int i = 1; i <= l; i++)
  16.         scanf("%d", list + i);   

  17.     // for (int i = 1; i <= m; i++)
  18.     //     dp[i][0] = 0;

  19.     // for (int i = 1; i <= l; i++)
  20.     //     dp[0][i] = 0;

  21.     int ans = -1;
  22.     for (int i = 1; i <= m; i++)
  23.     {
  24.         for (int j = 1; j <= l; j++)
  25.         {
  26.             dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);

  27.             if (order[i] == list[j]) dp[i][j]++;
  28.             if (dp[i][j] > ans) ans = dp[i][j];
  29.         }        
  30.     }

  31.     printf("%d", ans);

  32.     return 0;
  33. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 04:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表