SRM398 div1 medium

cache[y][x][何個訪れた][最後に訪れた番号]でメモ化再帰

#include <cstring>
#include <vector>
#include <cstdio>

using namespace std;

int field[60][60];
int cache[60][60][60][60];

class CountPaths 
{
	public:

		int rec(int y,int x,int v,int l)
		{
			if(y<1 || x<1 || v<0)
				return 0;
			else
			{
				int &r=cache[y][x][v][l];

				if(r!=-1)
					;
				else if(y==1 && x==1)
				{
					if(field[y][x]!=-1 && v==1)
						r=(field[y][x]<l)?1:0;
					else if(field[y][x]==-1 && v==0)
						r=1;
					else
						r=0;
				}
				else if(field[y][x]!=-1 && field[y][x]<l)
					r=(rec(y-1,x,v-1,field[y][x])+rec(y,x-1,v-1,field[y][x]))%1000007;
				else if(field[y][x]==-1)
					r=(rec(y-1,x,v,l)+rec(y,x-1,v,l))%1000007;
				else
					r=0;

				return r;
			}
		}

		vector <int> difPaths(int r, int c, vector <int> fieldrow, vector <int> fieldcol) 
		{
			memset(cache,-1,sizeof(cache));
			for(int i=0;i<=r;i++)
				for(int j=0;j<=c;j++)
					field[i][j]=-1;
			for(int i=0;i<fieldrow.size();i++)
				field[fieldrow[i]][fieldcol[i]]=i;

			vector<int> ans;
			for(int i=0;i<=fieldrow.size();i++)
				ans.push_back(rec(r,c,i,51));

			return ans;
		}
};