【题目大意】
NOIP的传纸条。不过点权只能为1.
【算法分析】
f[k][i][j]表示走k-2步第一个人走到第i行,第二个人走到第j行,所能达到的最大分数。
之所以搞k-2是因为对于一个人的坐标(i,j)有i+j=k
【其它】1A
= =又在刷水题了。。。。
【CODE】
#include 
int m,n;
char a[111][111];
int f[222][111][111];
void init(){
     scanf("%d%d",&n,&m);
     for (int i=1;i<=m;i++) scanf("%s",a[i]+1);
     for (int i=1;i<=m;i++)
       for (int j=1;j<=n;j++)
         switch (a[i][j]){
             case ‘.’:a[i][j]=0; break;
             case ‘*’:a[i][j]=1; break;
             case ‘#’:a[i][j]=2; break;
         }     
     memset(f,200,sizeof(f));
}   
inline void max(int &x,int y){
     if (y>x) x=y;
}   
void work(){
     f[2][1][1]=a[1][1];
     for (int k=3;k<=m+n;k++)
       for (int i=1;i<=m;i++) if (k-i<1 || k-i>n) continue; else
         for (int j=1;j<=m;j++) if (k-j<1 || k-j>n) continue; else{
             if (a[i][k-i]==2 || a[j][k-j]==2) continue;
             int &t=f[k][i][j];
             max(t,f[k-1][i-1][j-1]);
             max(t,f[k-1][i-1][j]);
             max(t,f[k-1][i][j-1]);
             max(t,f[k-1][i][j]);
             t+=a[i][k-i];
             if (i!=j) t+=a[j][k-j];
         }     
     max(f[m+n][m][m],0);
     printf("%dn",f[m+n][m][m]);
}   
int main(){
     freopen("input.txt","r",stdin);
     freopen("output.txt","w",stdout);
     int tc;
     scanf("%d",&tc);
     for (int i=1;i<=tc;i++){
       init();
       work();
     }     
}   
直接流一流..