classSolution{public:intmaxVacationDays(vector<vector<int>>&flights,vector<vector<int>>&days){// dp[i][j] := # of vacations can be taken from i-th city and k-th weekdp.resize(days.size(),vector<int>(days[0].size(),INT_MIN));returnmaxVacationDays(flights,days,0,0);}private:vector<vector<int>>dp;intmaxVacationDays(constvector<vector<int>>&flights,constvector<vector<int>>&days,inti,intk){if(k==days[0].size())return0;if(dp[i][k]!=INT_MIN)returndp[i][k];intans=0;// Stay at j or fly from i -> jfor(intj=0;j<flights.size();++j)if(j==i||flights[i][j]==1)ans=max(ans,days[j][k]+maxVacationDays(flights,days,j,k+1));returndp[i][k]=ans;}};
classSolution{publicintmaxVacationDays(int[][]flights,int[][]days){// dp[i][j] := # of vacations can be taken from i-th city and k-th weekdp=newint[days.length][days[0].length];Arrays.stream(dp).forEach(A->Arrays.fill(A,Integer.MIN_VALUE));returnmaxVacationDays(flights,days,0,0);}privateint[][]dp;privateintmaxVacationDays(int[][]flights,int[][]days,inti,intk){if(k==days[0].length)return0;if(dp[i][k]!=Integer.MIN_VALUE)returndp[i][k];intans=0;// Stay at j or fly from i -> jfor(intj=0;j<flights.length;++j)if(j==i||flights[i][j]==1)ans=Math.max(ans,days[j][k]+maxVacationDays(flights,days,j,k+1));returndp[i][k]=ans;}}
classSolution{public:intmaxVacationDays(vector<vector<int>>&flights,vector<vector<int>>&days){constintN=days.size();constintK=days[0].size();// dp[i][j] := # of vacations can be taken from i-th city and k-th weekvector<vector<int>>dp(N,vector<int>(K+1));for(intk=K-1;k>=0;--k)for(inti=0;i<N;++i){dp[i][k]=days[i][k]+dp[i][k+1];for(intj=0;j<N;++j)if(flights[i][j]==1)dp[i][k]=max(dp[i][k],days[j][k]+dp[j][k+1]);}returndp[0][0];}};