NC217997. 牛客推荐系统开发之选飞行棋子
描述
输入描述
第一行输入一个整数,表示共有
种棋子。(
)
接下来四行每行一个长度为的字符串,接下来的第
行第
个字符是
表示第
个人没有第
种棋子,如果是
则表示有第
个人有第
种棋子。
输出描述
输出一行一个整数表示一共有多少种选择棋子的方式。
示例1
输入:
3 000 000 000 000
输出:
0
示例2
输入:
4 1000 0100 0010 0001
输出:
1
示例3
输入:
4 1111 1111 1111 1111
输出:
24
C 解法, 执行用时: 18ms, 内存消耗: 1016K, 提交时间: 2021-06-13 21:14:02
#include<stdio.h> long long f[5005][17]; char a[5][5005]; int main() { int i,j,k,l,n,m; scanf("%d",&n); for(i=1;i<=4;i++){ getchar(); for(j=1;j<=n;j++)scanf("%c",&a[i][j]);} for(i=0;i<=n;i++) for(j=0;j<=15;j++) if(j==0)f[i][j]=1; else f[i][j]=0; for(i=1;i<=n;i++) for(j=1;j<=15;j++){ f[i][j]+=f[i-1][j];//全都不选 for(k=1;k<=4;k++) if(1<<(k-1)&j&&a[k][i]=='1'){ f[i][j]+=f[i-1][j^1<<(k-1)]; } } printf("%lld",f[n][15]); }
C++ 解法, 执行用时: 4ms, 内存消耗: 1016K, 提交时间: 2021-06-11 19:19:58
#include<iostream> using namespace std; #define ll long long #define For(i,l,r) for(int i=l;i<=r;i++) #define MAXN 10001 int N,a[4][MAXN];ll f[MAXN][1<<4]; int main() { cin>>N;For(i,0,3)For(j,1,N){char c;cin>>c;a[i][j]=c-'0';} f[0][0]=1;For(i,1,N)For(j,0,15)For(k,0,3){if(!k)f[i][j]+=f[i-1][j];if(a[k][i]&&((j>>k)&1))f[i][j]+=f[i-1][j^(1<<k)];}cout<<f[N][15]<<endl;return 0; }