MAXWOODS - MAXIMUM WOOD CUTTER - SPOJ Solution C++

  Problem Link : MAXWOODS 


👉 Hint : Use 2D or 3D DP

 


✅ C++ Solution :

 
#include<bits/stdc++.h>
using namespace std;
int dp[201][201][2];
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int t;
	cin>>t;
	while(t--)
	{
		int m,n;
		cin>>m>>n;
		char arr[m][n];
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
				cin>>arr[i][j];
		}

		int cnt=0;
		for(int i=0;i<m;i++)
		{
		    for(int j=0;j<n;j++)
		        dp[i][j][0]=dp[i][j][1]=INT_MIN;
		}
		for(int i=0;i<n;i++)
		{
			if(arr[0][i]=='#')
				break;
			else if(arr[0][i]=='T')
				dp[0][i][0]=++cnt;
			else
				dp[0][i][0]=cnt;
		}
		for(int i=1;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(j==0)
				{
					if(arr[i][j]=='T' && dp[i-1][j][1]!=-1)
						dp[i][j][0]=1+dp[i-1][j][1];
					if(arr[i][j]=='0')
						dp[i][j][0]=dp[i-1][j][1];
					if(arr[i][n-1-j]=='T' && dp[i-1][j][0]!=-1 )
						dp[i][n-1-j][1]=1+dp[i-1][n-1-j][0];
					if(arr[i][n-1-j]=='0')
						dp[i][n-1-j][1]=dp[i-1][n-1-j][0];
					cnt=max(cnt,dp[i][j][0]);
					cnt=max(cnt,dp[i][n-1-j][1]);
				}
				else
				{
					if(arr[i][j]=='T')
							dp[i][j][0]=1+max(dp[i][j-1][0],dp[i-1][j][1]);
					if(arr[i][j]=='0')
						dp[i][j][0]=max(dp[i][j-1][0],dp[i-1][j][1]);
					if(arr[i][n-1-j]=='T')
						dp[i][n-1-j][1]=1+max(dp[i][n-j][1],dp[i-1][n-1-j][0]);
					if(arr[i][n-1-j]=='0')
						dp[i][n-1-j][1]=max(dp[i][n-j][1],dp[i-1][n-1-j][0]);
					cnt=max(cnt,dp[i][j][0]);
					cnt=max(cnt,dp[i][n-1-j][1]);
				}

			}
		}

		cout<<cnt<<endl;


	}
}

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!