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; }