70pt求调
查看原帖
70pt求调
326254
LonginusMonkey楼主2023/9/17 22:05

新手的第一道dp

#include<bits/stdc++.h>
using namespace std;
int arr[110][11];
int dp[13][8193];
void mol(int &index) {
	index = index % 100000000;
}
int main() {
	int sum = 0;
	int n, m;
	cin >> n >> m;
	for(int i=1; i<=n; ++i) {
		for(int j=1; j<=m; ++j) {
			cin >> arr[i][j];
		}
	}
	for(int i=0; i<=(1<<m)-1; ++i) {
		if(((i<<1) & i) != 0 || ((i>>1) & i) != 0) {
			continue;
		}
		dp[1][i] = 1;
	}
	for(int i=2; i<=n; ++i) {
		int s2 = 0, s3 = 0;
		for(int j=1; j<=m; ++j) {
			s2 = s2*2 + arr[i][j];
		}
		for(int j=1; j<=m; ++j) {
			s3 = s3*2 + arr[i-1][j];
		}
		for(int j=0; j<=(1<<m)-1; ++j) {
			if((j & s2) != j) continue;
			if((j & (j<<1)) != 0 || (j & (j>>1)) != 0) {
				continue;
			}
			for(int k=0; k<=(1<<m)-1; ++k) {
				if((s3 & k) != k) {
					continue;
				}
				if((k & (k<<1)) != 0 || (k & (k>>1)) != 0) {
					continue;
				}
				if((j & k) != 0) {
					continue;
				}
				dp[i][j] += dp[i-1][k];
			}
			if(i==n) {
				sum += dp[i][j];
			}
		}
	}
	cout << sum;
	return 0;
}
2023/9/17 22:05
加载中...