做一个类似京东的网站,装修设计费多少钱一平,怎么使用模板建设网站,aws注册wordpress正题
题目链接:https://jzoj.net/senior/#contest/show/3008/1 题目大意 n∗mn*mn∗m的格子#xff0c;kkk种颜色涂色#xff0c;求有多少种方案使得没有任意一条只往右和下的路径经过相同颜色。 解题思路
显然如果nm−1knm-1knm−1k就无解#xff0c;所以nm−…正题
题目链接:https://jzoj.net/senior/#contest/show/3008/1 题目大意
n∗mn*mn∗m的格子kkk种颜色涂色求有多少种方案使得没有任意一条只往右和下的路径经过相同颜色。 解题思路
显然如果nm−1knm-1knm−1k就无解所以nm−1nm-1nm−1最大为101010考虑搜索。
两个剪枝
可行性剪枝:如果剩下可用颜色不超过剩下步骤那么直接退出。对称性剪枝:如果有若干种颜色目前都没有使用过那么这个格子选择任何一种颜色答案是一样的。 codecodecode
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N15;
int n,m,k,a[N][N],f[N][N],v[N];
int dfs(int x,int y)
{if(ym) x,y1;if(xn) return 1;int ans0,tmp-1,num0;int zf[x-1][y]|f[x][y-1];while(z) num,z-(z-z);if(nm-x-y1k-num) return 0;for(int i1;ik;i){if(a[x][y]a[x][y]!i)continue;if((1i-1)(f[x-1][y]|f[x][y-1])) continue;v[i];f[x][y]f[x-1][y]|f[x][y-1]|(1i-1);if(v[i]1){if(tmp-1)tmpdfs(x,y1);anstmp;}else ansdfs(x,y1);v[i]--;}return ans;
}
int main()
{scanf(%d%d%d,n,m,k);if(nm-1k){printf(0);return 0;}for(int i1;in;i)for(int j1;jm;j)scanf(%d,a[i][j]),v[a[i][j]];printf(%d,dfs(1,1));
}