[ CodeVS冲杯之路 ] P1044

  不充钱,你怎么AC?

  题目:http://codevs.cn/problem/1044/

  机房连续断网,搞得现在才能上博客……

  很经典的DP题,把问题转换一下就是分别求最不降序列和最长上升序列

  f[i][j] 表示可以选择多少个,第一问

  

  目标状态是 max(f[i])

  第二问同理,仅仅是把条件的符号换了一下

  

  目标状态也是 max(f[i])

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #define oo 2147483647
 8 #define N 21
 9 using namespace std;
10 
11 int a[N],f[N],n,ans,last[N];
12 int main()
13 {
14     int i=0,j;
15     while (scanf("%d",&a[++i])!=EOF);
16     n=i-1;
17     a[0]=oo;
18     for (i=1;i<=n;i++)
19     {
20         for (j=0;j<i;j++)
21         {
22             if (a[j]>=a[i])
23             {
24                 if (f[i]<f[j]+1)
25                 {
26                     f[i]=f[j]+1;
27                     ans=max(ans,f[i]);
28                 }
29             }
30         }
31     }
32     printf("%d
",ans);
33     a[0]=0;
34     ans=0;
35     for (i=1;i<=n;i++)
36     {
37         f[i]=0;
38         for (j=0;j<i;j++)
39         {
40             if (a[j]<a[i])
41             {
42                 if (f[i]<f[j]+1)
43                 {
44                     f[i]=f[j]+1;
45                     ans=max(ans,f[i]);
46                 }
47             }
48         }
49     }
50     printf("%d
",ans);
51     return 0;
52 }
原文地址:https://www.cnblogs.com/hadilo/p/5865216.html