uva 103/UVA 10405 [lcs]

uva103:題目給的是第i個的排位。

CODE:

<span style="font-size:12px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#define INF 0x7fffffff
#define SUP 0x80000000
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

typedef long long LL;
const int N=100007;

struct node{
    int n,id;
    int e[33];
    bool operator <(node a) const
    {
        for(int i=1;i<=n;i++)
        {
            if(e[i]>a.e[i])
                return false;
        }
        return true;
    }
}p[33];

int pre[33],dp[33],G[33][33];

void output(int id)
{
    if(pre[id]!=-1)
        output(pre[id]);
    printf("%d ",p[id].id);
}

inline bool isBigger(int a, int b,int k){
    for(int i=1; i<=k; ++i)
        if(p[a].e[i]<=p[b].e[i])return false;
    return true;
}

int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k)==2)
    {
        for(int i=0;i<n;i++)
        {
            p[i].n=k;
            p[i].id=i+1;
            for(int j=1;j<=k;j++)
                scanf("%d",&(p[i].e)[j]);
            sort((p[i].e)+1,(p[i].e)+1+k);
        }
        sort(p,p+n);

         memset(G, 0, sizeof(G));
        for(int i=0; i<n-1; ++i){
            for(int j=i+1; j<n; ++j){
                if(isBigger(j,i,k))
                    G[i][j]=1;
            }
        }

        mem(pre,-1),mem(dp,0);
        int ans=0,id,maxx;
        for(int i=0;i<n;i++)
        {
            maxx=0;
            for(int j=0;j<i;j++)
            {
                if(G[j][i]&&dp[j]>maxx)
                {
                    maxx=dp[j];
                    pre[i]=j;
                }
            }
            dp[i]=maxx+1;
            if(dp[i]>ans)
            {
                ans=dp[i];
                id=i;
            }
        }

        printf("%d\n",ans);
        if(pre[id]!=-1)
            output(pre[id]);
        printf("%d\n",p[id].id);
    }
    return 0;
}
</span>


uva 10405:有坑,一個串可能有空格!

CODE:

<span style="font-size:12px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#define INF 0x7fffffff
#define SUP 0x80000000
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

typedef long long LL;
const int N=1007;

char a[N],b[N];
int dp[N][N];

int main()
{
    while(gets(a+1))
    {
        gets(b+1);
        mem(dp,0);
        int la=strlen(a+1);
        int lb=strlen(b+1);
        for(int i=1;i<=la;i++)
        {
            for(int j=1;j<=lb;j++)
            {
                if(a[i]==b[j])
                    dp[i][j]=dp[i-1][j-1]+1;
                else
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        printf("%d\n",dp[la][lb]);
    }
    return 0;
}</span>


發佈了149 篇原創文章 · 獲贊 16 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章