Advertisement
prakharvk

maximum length snake sequence

Jun 21st, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. stack<pair<int,int> >calcPath(vector<vector<int> >&dp,int row,int column){
  4.     pair<int,int>pt;
  5.     stack<pair<int,int> >st;
  6.     st.push({row,column});
  7.     pt={row,column};
  8.     while(dp[pt.first][pt.second]!=0){
  9.         int i=pt.first;
  10.         int j=pt.second;
  11.         if(i>0&&(dp[i-1][j]+1==dp[i][j])){
  12.             st.push({i-1,j});
  13.             pt={i-1,j};
  14.         }
  15.         else if(j>0&&(dp[i][j-1]+1==dp[i][j])){
  16.             st.push({i,j-1});
  17.             pt={i,j-1};
  18.         }
  19.     }
  20.     return st;
  21. }
  22.  
  23. stack<pair<int,int> > findMaxPath(vector<vector<int> >&v){
  24.     int m=v.size();
  25.     int n=v[0].size();
  26.     vector<vector<int> >dp(m,vector<int>(n,0));
  27.     int max_row=0;
  28.     int max_column=0;
  29.     int max_length=0;
  30.     for(int i=0;i<m;i++){
  31.         for(int j=0;j<n;j++){
  32.             if(i||j){
  33.          
  34.                 if(j>0&&(abs(v[i][j-1]-v[i][j])==1)){
  35.                     dp[i][j]=max(dp[i][j],dp[i][j-1]+1);
  36.                     if(dp[i][j]>max_length){
  37.                         max_row=i;
  38.                         max_column=j;
  39.                         max_length=dp[i][j];
  40.                     }
  41.                 }
  42.                 if(i>0&&(abs(v[i-1][j]-v[i][j])==1)){
  43.                     dp[i][j]=max(dp[i][j],dp[i-1][j]+1);
  44.                     if(dp[i][j]>max_length){
  45.                         max_row=i;
  46.                         max_column=j;
  47.                         max_length=dp[i][j];
  48.                     }
  49.                 }
  50.             }
  51.         }
  52.     }
  53.    
  54.     stack<pair<int,int> >path=calcPath(dp,max_row,max_column);
  55.     return path;
  56. }
  57.  
  58. int main(){
  59.     int m, n;
  60.     cin>>m>>n;
  61.     vector<vector<int> >v(m);
  62.     for(int i=0;i<m;i++){
  63.         for(int j=0;j<n;j++){
  64.             int c;
  65.             cin>>c;
  66.             v[i].push_back(c);
  67.         }
  68.     }
  69.     stack<pair<int,int> >st=findMaxPath(v);
  70.     while(!st.empty()){
  71.         cout<<v[st.top().first][st.top().second]<<" ";
  72.         st.pop();
  73.     }
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement