hdu 1257 dp2

来源:互联网 发布:网络记事本哪个好用 编辑:程序博客网 时间:2024/06/05 06:22

2014/9/23


  老早做过的题目(贪心,暴力dp= =),不过下面的dp代码太神了233

(原抄某博客)

开始看了5分钟不能理解= =。

后来领悟了点,但还是说不出来,就留给大牛去解释吧。。

这代码留给自己看看(不算抄袭吧= =)


#include<stdio.h>#include<string.h>#include<cmath> #include<algorithm>#include<iostream>#include<queue>#include<stack>#include<map>#include<climits>#include<vector>using namespace std;typedef long long ll;  #define f(x,y,i) for(int i = x;i < y; ++i)#define ff(x,y,i) for(int i = x;i  <= y; ++i)#define F(x,y,i) for(int i = x; i >= y; --i)#define FF(x,y,i) for(int i = x; i > y; ++i)#define lson pos<<1,l,mid#define rson pos<<1|1,mid+1,r#define sc(n) scanf("%d",&n)#define pr(n) printf("%d\n",n)#define met(n,m) memset(n, m, sizeof(n)) #define mod 10007int Max(int a,int b){    return a>b?a:b;}int Min(int a,int b){    return  a<b?a:b;}const int N=1050;int s[N];int ans[N],maxn = 0;int dp[N];int n, m;int main(){       while(~scanf("%d",&n))   {    maxn = 0;    f(0,n,i)    scanf("%d",&s[i]),dp[i]= 1;        f(0 ,n, i)    {    for(int j = i -1;j >= 0; --j)    {    if(s[i] > s[j] &&dp[i] <  dp[j] + 1)    {    dp[i] = dp[j] + 1;    }    }    }           f(0, n, i)    {    if(maxn < dp[i])maxn = dp[i];    }       printf("%d\n",maxn);     }      return 0;}

遍历过去,遇到的每颗导弹都判断前面有没有高度比当前导弹低的,有的话(第 j 颗 比 第 i 颗 低,i > j),在这颗导弹上用的就是第 dp[ j] + 1套系统,因为在前面比它低的导弹

有很多,所以你要在去前面遍历一遍,取 max (dp[i ] =Max(dp[j]  +1)( 0=< J < i  && 高度 j < 高度 i) 

0 0
原创粉丝点击