Alignment(dp)

http://poj.org/problem?id=1836

求两遍最长上升子序列,顺序求一遍,逆序求一遍。

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int N=1002;
 4 int dp1[N],dp2[N];
 5 double a[N];
 6 int main()
 7 {
 8     int n;
 9     scanf("%d",&n);
10     for (int i = 1; i <= n; i++)
11     {
12         scanf("%lf",&a[i]);
13     }
14     dp1[1] = 1;
15     for (int i = 2; i <= n; i++)
16     {
17         int temp = 0;
18         for (int j = 1; j < i; j++)
19         {
20             if (a[i] > a[j])
21             {
22                 if (temp < dp1[j])
23                     temp = dp1[j];
24             }
25         }
26         dp1[i] = temp+1;
27     }
28     dp2[n] = 1;
29     for (int i = n-1; i > 0; i--)
30     {
31         int temp =  0;
32         for (int j = n; j > i; j--)
33         {
34             if (a[i] > a[j])
35             {
36                 if (temp < dp2[j])
37                     temp = dp2[j];
38             }
39         }
40         dp2[i] = temp+1;
41     }
42     int Max = 0;
43     for (int i = 1; i <= n; i++)
44     {
45         for (int j = i+1; j <= n; j++)
46         {
47             if (Max < dp1[i]+dp2[j])
48                 Max = dp1[i]+dp2[j];
49         }
50     }
51     printf("%d\n",n-Max);
52     return 0;
53 }
View Code

 

转载于:https://www.cnblogs.com/lahblogs/p/3525440.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值