Advertisement
Guest User

palpath

a guest
Apr 7th, 2015
406
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.75 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class palpath{
  5.     public static void main (String [] args) throws IOException {
  6.         BufferedReader f = new BufferedReader(new FileReader("palpath.in"));
  7.         PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("palpath.out")));
  8.         StringTokenizer sc = new StringTokenizer(f.readLine());
  9.         int n = Integer.parseInt(sc.nextToken());
  10.         long mod = (long)1000000007;
  11.         //long dp[][][]= new long[n][n][n];//d[i][j][k] corresponds to the points (j,i-j)  (0<=j<=i) and (n-1-k,n-1-(i-k)) under similar constraints. i ranges from 0 to n-1.
  12.         char square[][] = new char[n][n];
  13.         for(int i = 0;i<n;i++){
  14.             String s = f.readLine();
  15.             for(int j = 0;j<n;j++){
  16.                 square[i][j]=s.charAt(j);
  17.             }
  18.         }
  19.         long dpp1[][] = new long[n][n];//darn memory is hard.
  20.         long dpp2[][] = new long[n][n];
  21.         //dp[0][0][0]=(square[0][0]==square[n-1][n-1] ? 1L : 0L);
  22.         dpp2[0][0]=(square[0][0]==square[n-1][n-1] ? 1L : 0L);
  23.         for(int i = 1;i<n;i++){
  24.             for(int j = 0;j<i;j++){
  25.                 for(int k = 0;k<i;k++){
  26.                     dpp1[j][k]=dpp2[j][k];
  27.                 }
  28.             }
  29.             for(int j = 0;j<=i;j++){
  30.                 for(int k = 0;k<=i;k++){
  31.                     if(square[j][i-j]==square[n-1-k][n-1-i+k]){
  32.                     //  System.out.println("yes at " + i  + " " + j + " " + k);
  33.                         dpp2[j][k]=0L;
  34.                         dpp2[j][k]+=(j>0 ? (k>0 ? dpp1[j-1][k-1] : 0L) : 0L);
  35.                         dpp2[j][k]+=(j>0 ? (k<i ? dpp1[j-1][k] : 0L) : 0L);
  36.                         dpp2[j][k]+=(j<i ? (k>0 ? dpp1[j][k-1] : 0L) : 0L);
  37.                         dpp2[j][k]+=(j<i ? (k<i ? dpp1[j][k] : 0L) : 0L);
  38.                         dpp2[j][k]=dpp2[j][k]%mod;
  39.                     }
  40.                     else{
  41.                         dpp2[j][k]=0L;
  42.                     }
  43.                 }
  44.             }
  45.         }
  46.         long answer = 0L;
  47.         for(int i = 0;i<n;i++){
  48.             answer+=dpp2[i][n-1-i];
  49.             answer=answer%mod;
  50.         }
  51.         out.println(answer);
  52.         out.close();
  53.         System.exit(0);
  54.     }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement