动态规划感觉挺有意思的,以前不怎么爱,,现在有点改观了。。。。(*^__^*) 嘻嘻……,做这一类体,主要是找准状态转移方程。。。。
这一题的状态转移方程。。
从后往前:
if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);
从前往后:
if(a[i]<a[j]) dp[i]=max(dp[i],dp[j]+1);
AC代码:
#include<iostream> #include<algorithm> using namespace std; int dp[20],a[20]; int main() { int Case; cin>>Case; while(Case--) { int n; cin>>n; dp[n]=1; for(int i=0;i<n;++i) { dp[i]=1; cin>>a[i]; } int maxx=-0xfffff; for(int i=n-1;i>0;--i) { for(int j=i+1;j<=n;++j) if(a[i-1]>a[j-1]) dp[i]=max(dp[i],dp[j]+1); maxx=max(dp[i],maxx); } cout<<maxx<<endl; }return 0; }法二:
#include<iostream> #include<algorithm> using namespace std; int dp[20],a[20]; int main() { int Case; cin>>Case; while(Case--) { int n; cin>>n; for(int i=0;i<n;++i) cin>>a[i]; int maxx=-0xfffff; for(int i=1;i<=n;++i) { dp[i]=1; for(int j=1;j<i;++j) if(a[i-1]<a[j-1]) dp[i]=max(dp[i],dp[j]+1); maxx=max(dp[i],maxx); } cout<<maxx<<endl; }return 0; }法三:
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)
{return a>b;}
int main()
{int n;
cin>>n;
while(n--)
{ int a[21];
int b[21];
int m;
cin>>m;
for(int i=0;i<m;++i)
cin>>a[i];
int p=0;
for(int i=0;i<m;++i)
{ int* c=lower_bound(b,b+p,a[i],cmp);
if(c-b==p) ++p;
*c=a[i];
}
cout<<p<<endl;
}return 0;
}