I Will Like Matrix!
题目大意:
有一个01矩阵,a[i][j+1]a[i][j+1]a[i][j+1]和a[i+1][j]a[i+1][j]a[i+1][j]必须大于a[i][j]a[i][j]a[i][j],问有多少种填法
原题:
题目描述
在一个 n ∗ m 的矩阵 A 的所有位置中分别填入 0 或 1,要求填入的数必须满足 Ai,j ≤ Ai,j+1 且
Ai,j ≤ Ai+1,j。询问一共有多少种不同的矩阵,并将答案对 1, 000, 000, 007 取模。
输入
共一行包含两个整数 n 和 m。
输出
共一行包含一个整数 ans,表示矩阵个数模 1, 000, 000, 007 的值。
输入样例
2 2
输出样例
6
说明
对于 60% 的数据:n, m, k ≤ 300
对于 100% 的数据:n, m, k ≤ 5000
解题思路:
我先想了想0和1的可能,然后想到最后一个是0的只有一种可能:全部是0,
然后想1的可能,但没想出来,打了一个暴力枚举答案,发现了规律:a[i][j]=a[i−1][j]+a[i][j−1]+1a[i][j]=a[i-1][j]+a[i][j-1]+1a[i][j]=a[i−1][j]+a[i][j−1]+1(i,j表示矩阵的大小,所表示的是结果不算0的部分)
然后再加1就行了
代码:
#include<cstdio>
#define zyc 1000000007ll
using namespace std;
int n,m,a[5005][5005];
int main()
{scanf("%d %d",&n,&m);for (int i=1;i<=n;++i)for (int j=1;j<=m;++j)a[i][j]=(a[i-1][j]+a[i][j-1]+1)%zyc;//DPprintf("%lld",(a[n][m]+1)%zyc);//加上0的可能
}