ZOJ Bookcase

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3523

ZOJ 求使无序的序列变有序的最小花费, LIS, struct 初始化需要特别注意

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>

int f_min(int x,int y) {if(x<y)return x;else return y;}
int f_max(int x,int y) {if(x>y)return x;else return y;}
int f_abs(int x) {return x>0?(x):(-x);}
using namespace std;

const int MM = 555555;
int N, M;
int head[MM], NE;
int f[MM], d[MM];
bool visx[MM], visy[MM];
struct Edge{
    int v,w,next;
}edge[MM<<2];

void reset(int n) {
    NE = 0;
    memset(head,-1,sizeof(head));
    memset(visx,false,sizeof(visx));
    memset(visy,false,sizeof(visy));
}
void add_edge(int u,int v,int w) {
    edge[NE].v=v, edge[NE].w=w;
    edge[NE].next=head[u], head[u]=NE++;
}
struct Pos{
    char str[100];
    int  aci[100];
    int len;
    int id;
    void reset() {id=len=0; memset(aci,0,sizeof(aci));}
}g[55][55];
char last[100][100];

void tran() {
    int i,j,k;
    for(i=0;i<N;i++) {
        for(j=0;j<M;j++) {
            for(k=0;k<g[i][j].len;k++) {
                printf("%d ",g[i][j].aci[k]);
            }
            printf("\n");
        }
    }
}
void get_data() {
    int i,j,k,a,b,c;
    for(i=0;i<N;i++) {
        for(j=0;j<M;j++) g[i][j].reset();
    }
    getchar();
    for(i=0;i<N;i++) {
        for(j=0;j<M;j++) {
            gets(g[i][j].str);
            g[i][j].len=strlen(g[i][j].str);
            for(k=0;k<g[i][j].len;k++) g[i][j].aci[k]=g[i][j].str[k];
        }
    }
//    tran();
}
int ok(int*A,int Alen,int*B,int Blen) {
    int len=f_max(Alen,Blen);
    for(int i=0;i<len;i++) {
        if(A[i]<B[i]) return 2;
        if(A[i]>B[i]) return 3;
    }
    return 1;
}
int bsearch(int&a,int size) {
    int l=0, r=size-1;
    while(l<=r) {
        int mid=(l+r)>>1;
        if(a>=f[mid-1] && a<f[mid]) return mid;
        else if(a<f[mid]) r=mid-1;
        else l=mid+1;
    }
    return -1;
}
int LIS(int p) {
    int i,j,size=1;
    f[0]=g[p][0].id; d[0]=1;
    for(i=1;i<M;i++) {
        if(g[p][i].id<f[0]) j=0;
        else if(g[p][i].id>=f[size-1]) j=size++;
        else j=bsearch(g[p][i].id,size);
        if(j>=0) f[j]=g[p][i].id; d[i]=j+1;
    }
    return size;
}
void solve() {
    int i,j,k, ans=0, tmp;
    for(i=0;i<N;i++) {
        for(j=0;j<M;j++) {
            for(k=0;k<M;k++) {
                tmp=ok(g[i][j].aci,g[i][j].len,g[i][k].aci,g[i][k].len);
                if(tmp==3) g[i][j].id++;
            }
//            printf("%d %d %d\n",i,j,g[i][j].id);
        }
    }
    for(i=0;i<N;i++) {
        ans+=(M-LIS(i));
//        printf("%d\n",ans);
    }
    printf("%d\n",ans);
}
int main() {
    while(scanf("%d%d",&N,&M)!=EOF) get_data(),solve();
    return 0;
}
原文地址:https://www.cnblogs.com/zhang1107/p/2979413.html