标签:contains 个数 other 不能 状态 long ... 解决 style
Input
Output
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4
LIS最长上升子序列问题。f[i]记录以当前值作为最后一个数时的最大长度。每枚举一个数都找前面比他小且f[i]最大的状态+1。f[i]=max(f[j])+1
#include<stdio.h> #include<string.h> int f[1005],a[1005]; int max(int x,int y) { return x>y?x:y; } int main() { int n,i,j; scanf("%d",&n); memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } f[1]=1; for(i=2;i<=n;i++){ for(j=1;j<i;j++){ if(a[j]<a[i]){ f[i]=max(f[i],f[j]); } } f[i]++; } int ans=0; for(i=1;i<=n;i++){ ans=max(ans,f[i]); } printf("%d\n",ans); return 0; }
8 389 207 155 300 299 170 158 65Sample Output
2
贪心解决最少序列个数问题。数组记录每个序列的最小值,出现比他大的数存入新下标,数组长度即为个数。
#include<stdio.h> #include<string.h> int a[10005]; int main() { int n,x,c,i,j; while(~scanf("%d",&n)){ c=1; memset(a,0,sizeof(a)); a[1]=30001; for(i=1;i<=n;i++){ scanf("%d",&x); for(j=1;j<=c;j++){ if(a[j]>=x){ a[j]=x; break; } if(j==c){ a[++c]=x; break; } } } printf("%d\n",c); } return 0; }
Longest Ordered Subsequence与最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)
标签:contains 个数 other 不能 状态 long ... 解决 style
原文地址:http://www.cnblogs.com/yzm10/p/7367975.html