poj 1609 Tiling Up Blocks

discuss 里面说是双重不降。。
但是我的做法是先对某个排序,然后单重的lis。。

做完看题解。。 哇。。 人家的思路真是6。。

自己的:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
#define maxn 100010
struct jimu
{
    int a;
    int b;
    bool operator <(const jimu&wakaka)const
    {
        if(a==wakaka.a)
            return b>wakaka.b;
        return a>wakaka.a;
    }
}game[maxn];
int dp[maxn];
int main()
{
    int n;
    while(cin>>n&&n)
    {
        for(int i=1;i<=n;i++)
        {
            cin>>game[i].a>>game[i].b;
        }
        sort(game+1,game+n+1);
        memset(dp,0,sizeof(dp));
        dp[1]=game[1].b;
        int len=1;
        for(int i=2;i<=n;i++)
        {
            if(game[i].b<=dp[len])
            {
                len++;
                dp[len]=game[i].b;
            }
            else
            {
                int left=1;
                int right=len;
                int mid;
                while(left<=right)
                {
                    mid=(left+right)/2;
                    if(dp[mid]<game[i].b)
                    {
                        right=mid-1;
                    }
                    else
                    {
                        left=mid+1;
                    }
                }
                dp[left]=game[i].b;
            }
        }
        cout<<len<<endl;
    }
    cout<<"*"<<endl;
    return 0;
}

人家的(不错的思路,但是细想后发现还是差不多的感觉,不过人家用了dp,唔。。新思路get):

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
int game[110][110];
int dp[110][110];
int main()
{
    int n;
    while(cin>>n&&n)
    {
        memset(game,0,sizeof(game));
        int x,y;
        for(int i=1;i<=n;i++)
        {
            cin>>x>>y;
            game[x][y]++;//如果积木一样,那么他们一定在一起。。。
        }
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=100;i++)
        {
            for(int j=1;j<=100;j++)
            {
                dp[i][j]=max(dp[i-1][j],dp[i][j-1])+game[i][j];
            }
        }
        cout<<dp[100][100]<<endl;
    }
    cout<<"*"<<endl;

    return 0;
}

最后看了一下,还是我的快了3ms。。。。

ok 和江一起去玩镜像了!

你可能感兴趣的:(dp,poj,LIS)