日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF293B Distinct Paths题解

發(fā)布時(shí)間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF293B Distinct Paths题解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CF293B Distinct Paths

題意

給定一個(gè)\(n\times m\)的矩形色板,有kk種不同的顏料,有些格子已經(jīng)填上了某種顏色,現(xiàn)在需要將其他格子也填上顏色,使得從左上角到右下角的任意路徑經(jīng)過的格子都不會(huì)出現(xiàn)兩種及以上相同的顏色。路徑只能沿著相鄰的格子,且只能向下或者向右。

計(jì)算所有可能的方案,結(jié)果對(duì) \(1000000007 (10^9 + 7)\)

輸入及輸出格式

輸入格式

第一行,三個(gè)整數(shù)$ n, m, k (1 \le n, m \le 1000, 1 \le k \le 10)$;

接下來\(n\)行,每行包含\(m\)個(gè)整數(shù),表示顏色。其中\(0\)表示未涂色,非\(0\)表示顏色的編號(hào), 顏色編號(hào)為\(1\)\(k\)

輸出格式

一行,一個(gè)整數(shù),表示涂色方案對(duì)$ 1000000007 (10^9 + 7)$求模的結(jié)果。

樣例

此處就不掛了:傳送門

思路

看似數(shù)據(jù)很大:\(n, m, k (1 \le n, m \le 1000, 1 \le k \le 10)\),但是,\(k<n+m-1\) 時(shí),可以直接輸出\(0\)。因?yàn)闊o法走完一條路徑(一條路徑長度為\(n+m-1\),因?yàn)槭侵荒芟蛳隆⑾蛴易?#xff09;。

那么實(shí)際數(shù)據(jù)范圍很小,大概是$n+m-1 \le 10 $左右吧。

這么小的范圍很容易就可想到\(dfs\)。這里有兩個(gè)優(yōu)化,一個(gè)是如果搜到一半,發(fā)現(xiàn)剩下的顏色不夠用了就直接\(return\)。還有一個(gè)就是利用顏色\(A\)與顏色\(B\)的先后次序問題,路徑\(AB\)與路徑\(BA\)并不是同一種方案,所以搜索時(shí)如果搜到是第一次時(shí),就可以直接乘\(now\)就可以省去很多\(dfs\)

代碼很丑,勿噴。

#include<algorithm> #include<bitset> #include<complex> #include<deque> #include<exception> #include<fstream> #include<functional> #include<iomanip> #include<ios> #include<iosfwd> #include<iostream> #include<istream> #include<iterator> #include<limits> #include<list> #include<locale> #include<map> #include<memory> #include<new> #include<numeric> #include<ostream> #include<queue> #include<set> #include<sstream> #include<stack> #include<stdexcept> #include<streambuf> #include<string> #include<typeinfo> #include<utility> #include<valarray> #include<vector> #include<cstring> #include<cmath> #define MOD 1000000007 using namespace std;//惡心的頭文件 inline int read(){char ch=getchar();int res=0,f=1;while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') res=res*10+ch-'0',ch=getchar();return res*f; }//讀入優(yōu)化 inline void write(int zx){if(zx<0) zx=-zx,putchar('-');if(zx<10) putchar(zx+'0');else{write(zx/10);putchar(zx%10+'0');} }//輸出優(yōu)化 int n,m,k,cnt[50],a[50][50],sum,f[30][30],ps,ans,vv; int dfs(int x,int y){if(y==m+1){return dfs(x+1,1);}if(x==n+1) return 1;int S=0,num=0,mar=0,res=0,las=0;f[x][y]=f[x-1][y]|f[x][y-1];for(int i=1;i<=k;i++){if(!(f[x][y]&(1<<i-1))) ++num;}if(num<n+m-x-y+1) return 0;//第一個(gè)優(yōu)化if(a[x][y]==0){for(int i=1;i<=k;i++){if(!(f[x][y]&(1<<i-1))){if(cnt[i]==0){if(mar) res+=las,res%=MOD;//第二個(gè)優(yōu)化else{mar=1;cnt[i]++;f[x][y]|=1<<i-1;las=dfs(x,y+1);f[x][y]^=1<<i-1;cnt[i]--;res+=las;res%=MOD;}continue ;}cnt[i]++;f[x][y]|=1<<i-1;res+=dfs(x,y+1);f[x][y]^=1<<i-1;cnt[i]--;res%=MOD;}}}else{if(!(f[x][y]&(1<<a[x][y]-1))){f[x][y]|=1<<a[x][y]-1;res+=dfs(x,y+1);f[x][y]^=1<<a[x][y]-1;res%=MOD;}}return res; } int main(){n=read();m=read();k=read();vv=n+m-1;if(k<vv){//開始先特判puts("0");return 0;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){a[i][j]=read();cnt[a[i][j]]++;}}ans=dfs(1,1);cout<<ans<<endl;return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/yzx1798106406/p/9871478.html

總結(jié)

以上是生活随笔為你收集整理的CF293B Distinct Paths题解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。