2014年 蓝桥杯

比赛时候,没有把两种状态分离。然后一直找错误。。。。。

被自己的傻萌哭了= = ///


#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 51
const int mod = 1000000007;
int mp[maxn][maxn];
int dp[maxn][maxn][13][13*13][2];
int n,m,k;
int quex[maxn * maxn],quey[maxn * maxn];
int head, tail;
int vis[maxn][maxn];
bool range(int x, int y)
{
	if(x < 1 || x > n)	return false;
	if(y < 1 || y > m)	return false;
	return true;
}
int main()
{
	scanf("%d %d %d",&n,&m,&k);
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= m;j++)
			scanf("%d",&mp[i][j]);
	}
	dp[1][1][0][0][0] = 1;
//	dp[1][1][1][mp[1][1]] = 1;
	head = tail = 0;
	quex[tail] = 1;
	quey[tail++] = 1;
	int big = 0;
	while(head < tail)
	{
		int x = quex[head];
		int y = quey[head++];
		if(vis[x][y])	continue;
		vis[x][y] = 1;
		int son1x = x + 1,son1y = y;
		int son2x = x, son2y = y + 1;
		if(range(son1x,son1y))	{quex[tail]=son1x;quey[tail++]=son1y;}
		if(range(son2x,son2y))	{quex[tail]=son2x;quey[tail++]=son2y;}
		big += mp[x][y];
		for(int i = 0;i <= k;i++)
		{
			for(int j = 0;j <= big;j++)
			{
				dp[x][y][i][j][0] += (dp[x-1][y][i][j][0]+dp[x-1][y][i][j][1]
										+dp[x][y-1][i][j][0]+dp[x][y-1][i][j][1]);
				//dp[x][y][i][j] %= mod;
				if(dp[x][y][i][j][0] > mod)	dp[x][y][i][j][0] -= mod;
			}
		}
		for(int i = 1;i <= k;i++)
		{
			for(int j = 0;j < mp[x][y];j++)
			{
				dp[x][y][i][mp[x][y]][1] += dp[x][y][i-1][j][0];  
				if(dp[x][y][i][mp[x][y]][1] > mod)	dp[x][y][i][mp[x][y]][1] -= mod;
			}
		}
		
	/*	printf("now  x : %d y : %d \n",x,y);
		for(int i = 0;i <= k;i++)
		{
			for(int j = 0;j <= big;j++)
			{
				printf("(%3d %3d)",dp[x][y][i][j][0],dp[x][y][i][j][1]);
			}
			printf("\n");
		}*/
	}
	int ans = 0;
	for(int i = 0;i <= big;i++)
	{
		ans += dp[n][m][k][i][0]+dp[n][m][k][i][1];
		if(ans > mod)	ans-=mod;
	}
	printf("%d\n",ans);
	return 0;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值