鱼C论坛

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

[技术交流] 动态规划问题

[复制链接]
发表于 2020-4-11 12:19:25 | 显示全部楼层 |阅读模式

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

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

x
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,   则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。
已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。



我用的是最长子序列的求法,正向一次遍历最长子序列,反向再遍历一次,正向与反向相加即得到了一个队列中最多的人数,也就是出队最少的人数。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <string.h>
  5. #define MAX 200

  6. int main()
  7. {
  8.     int n;
  9.     while(~scanf("%d", &n))
  10.     {
  11.         int i, j, max = 0;
  12.         int inc[MAX], dec[MAX], dp[MAX], stu[MAX];
  13.         memset(inc, 0, sizeof(int) * MAX);
  14.         memset(dec, 0, sizeof(int) * MAX);
  15.         memset(dp , 0, sizeof(int) * MAX);
  16.         memset(stu, 0, sizeof(int) * MAX);
  17.         for(i = 0; i < n; i++)
  18.         {
  19.             scanf("%d", stu + i);
  20.             for(j = i - 1; j >= 0; j--)
  21.             {
  22.                 if(stu[i] > stu[j] && inc[i] < inc[j] + 1)
  23.                     inc[i] = inc[j] + 1;
  24.             }
  25.         }
  26.         for(i = n - 1; i >= 0; i--)
  27.         {
  28.             for(j = i + 1; j < n; j++)
  29.             {
  30.                 if(stu[i] > stu[j] && dec[i] < dec[j] + 1)
  31.                     dec[i] = dec[j] + 1;
  32.             }
  33.             dp[i] = inc[i] + dec[i] + 1;//因为还有自己没算进去,所以要加1
  34.             if(max < dp[i])
  35.                 max = dp[i];
  36.         }
  37.         printf("%d\n", n - max);
  38.     }

  39.     return 0;
  40. }
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 07:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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