[ 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\n",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\n",ans); 51 return 0; 52 }