HDU1176(二维动态规划)

来源:互联网 发布:淘宝首页海报是指什么 编辑:程序博客网 时间:2024/06/05 16:11

没考虑到是二维的矩阵DP , 一开始想着按照最长不递减序列做的 , 不出意外的T 了。

需要矩阵优化才可以过。具体方法很简单,就是方向不好找罢了。



#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <map>#include <stack>#include <queue>#include <list>#include <cmath>using namespace std;#define cir(a,b) memset(a,b,sizeof a)typedef long long  LL;const int maxn = 200000+10;const int INF = 1e9+10;int n;struct Bing{    int d,t;} s[maxn];int dp[maxn][15];int d[maxn][15];bool cmp(const Bing& t1,const Bing& t2){    return t1.t < t2.t;}int main(){    while(cin >> n && n)    {        int Max = 0;        cir (d,0);        cir (dp,0);        for(int i=1; i<=n; i++)        {            cin >> s[i].d >> s[i].t;            s[i].d++;            d[s[i].t][s[i].d]++;            Max = max (Max , s[i].t);             //s[i].d -= 5;        }        //sort(s+1,s+n+1,cmp);        for(int i=1;i<=11;i++) dp[Max][i] = d[Max][i];        int m = 0;        for(int i=Max-1;i>=0;i--)        {            for(int j=1;j<=11;j++)            {                dp[i][j] = max(max(dp[i+1][j-1],dp[i+1][j+1]),dp[i+1][j]) + d[i][j];            }        }//        for(int i=1;i<=11;i++)//        {//            m=max(dp[1][i],m);//        }        cout << dp[0][6] <<endl;    }    return 0;}