#include #include const int Mod=9973; int cnt[2],box[2][Mod],now,pre; struct edge{ int to,next,num; } e[2][120000]; void add(int u,int num) { int idx=u%Mod; for(int p=box[pre][idx];p!=-1;p=e[pre][p].next) if (e[pre][p].to==u) { if (e[pre][p].num>num) e[pre][p].num=num; return ; } e[pre][cnt[pre]].to=u;e[pre][cnt[pre]].num=num; e[pre][cnt[pre]].next=box[pre][idx];box[pre][idx]=cnt[pre]++; } int a[100][20]; int b[20]; int base[20]; bool ok1(int i,int j) { return (a[i][j]>a[i][j-1]&&a[i][j-1]>a[i][j-2])|| (a[i][j]a[i-1][j]&&a[i-1][j]>a[i-2][j])|| (a[i][j]>=2; } while(k<=m) b[k++]=0; tmp-=b[j+1]*base[j+1]+b[0]; if (i==0) b[j+1]=0; if (j==0) b[0]=0; if (a[i][j]<=0) { add(tmp,num); continue; } if (b[0]==0) add(tmp+1,num+1); else if (b[0]==1&&a[i][j]!=a[i][j-1]) add(tmp+2,num) ; else if (ok1(i,j)) add(tmp+2,num); else add(tmp+1,num+1); if (b[j+1]==0) add(tmp+base[j+1],num+1); else if (b[j+1]==1&&a[i][j]!=a[i-1][j]) add(tmp+2*base[j+1],num); else if (ok2(i,j)) add(tmp+2*base[j+1],num); else add(tmp+base[j+1],num+1); } now^=1;pre^=1; } int ans=n*m; for(int i=0;ie[now][i].num) ans=e[now][i].num; printf("Case %d: %d\n",++T,ans); } return 0; }