导弹拦截&&http://acm.nyist.net/JudgeOnline/problem.php?pid=79

来源:互联网 发布:macbook pro 2017 知乎 编辑:程序博客网 时间:2024/06/05 05:10

动态规划感觉挺有意思的,以前不怎么爱,,现在有点改观了。。。。(*^__^*) 嘻嘻……,做这一类体,主要是找准状态转移方程。。。。

这一题的状态转移方程。。

从后往前:

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;}