poj1741,POJ 3254 poj3254 Corn Fields

 2023-10-15 阅读 22 评论 0

摘要:題意:給出一個n行m列的草地,1表示肥沃,0表示貧瘠,現在要把一些牛放在肥沃的草地上,但是要求所有牛不能相鄰,問你有多少種放法。 思路: DP[i][j]=sum(dp[i-1][k]); i表示當前這一行,狀態為j有多少種方案 poj1741。

題意:給出一個n行m列的草地,1表示肥沃,0表示貧瘠,現在要把一些牛放在肥沃的草地上,但是要求所有牛不能相鄰,問你有多少種放法。

思路:

DP[i][j]=sum(dp[i-1][k]); i表示當前這一行,狀態為j有多少種方案

poj1741。首先,i行能放牛的狀態由前一行i-1決定。所以我們只要知道前一行的狀態就知道這一行的方案。因此要初始化第一行的狀態dp[1][i]

要使當前這一行能用狀態j表示則應瞞足兩種條件

1 與當前這一行的地形符合

2 這一行狀態與前一行的某一狀態不沖突

poj2352。x&(x<<1)表示x的二進制是否有兩個相鄰的1相鄰

注意,初始化地形狀態的時候,應該是0所在的位所構成的數

 1 //#pragma comment(linker, "/STACK:167772160")//手動擴棧~~~~hdu 用c++交
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <cmath>
 9 #include <set>
10 #include <algorithm>
11 #include <vector>
12 // #include<malloc.h>
13 using namespace std;
14 #define clc(a,b) memset(a,b,sizeof(a))
15 #define LL long long
16 const int inf = 0x3f3f3f3f;
17 const double eps = 1e-5;
18 const double pi = acos(-1);
19 const LL MOD = 1e8;
20 const int N=1<<13;
21 // const LL p = 1e9+7;
22 // inline int r(){
23 //     int x=0,f=1;char ch=getchar();
24 //     while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
25 //     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
26 //     return x*f;
27 // }
28 
29 int dp[15][N];
30 int G[N];
31 int line[N];
32 bool judge1(int x){
33     return (x&(x<<1));
34 }
35 
36 bool judge2(int x,int y){
37     return G[x]&line[y];
38 }
39 int main(){
40     int m,n;
41     while(~scanf("%d%d",&n,&m)){
42         // clc(G,0);
43         // clc(dp,0);
44         // clc(line,0);
45     for(int i=1;i<=n;i++){
46         for(int j=1;j<=m;j++){
47             int x;
48             scanf("%d",&x);
49             if(x==0){
50                G[i]+=(1<<(m-j));
51             }
52         }
53     }
54 
55     int k=0;
56     for(int i=0;i<(1<<m);i++){
57         if(!judge1(i)){
58             line[k++]=i;
59         }
60     }
61     for(int i=0;i<k;i++){
62         if(!judge2(1,i))
63             dp[1][i]=1;
64     }
65 
66     for(int i=2;i<=n;i++){
67         for(int j=0;j<k;j++){
68             if(judge2(i,j))
69                 continue;
70             for(int f=0;f<k;f++){
71                 if(judge2(i-1,f))
72                     continue;
73                 if(!(line[j]&line[f]))
74                     dp[i][j]+=dp[i-1][f];
75             }
76         }
77     }
78     
79     int ans=0;
80     for(int i=0;i<k;i++){
81         ans+=dp[n][i];
82         ans%=MOD;
83     }
84     printf("%d\n",ans);
85     }
86     return 0;
87 }

?

轉載于:https://www.cnblogs.com/ITUPC/p/5527951.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/139070.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息