zoukankan      html  css  js  c++  java
  • 涂抹果酱

    涂抹果酱

     

     题目分析:这道题跟上一道题有点像,不过这题有三种,所以想到三进制,而不是二进制了,然后把1,2,3化成0,1,2;然后,相应的比较部分换一下就好了

    AC_Code:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int mod = 1e6;
     5 const int maxn = 1e4 + 10;
     6 
     7 int n, m, k;
     8 int maxx, tot, sta[250], zk, pos, ans;
     9 int f[10100][250];
    10 
    11 bool check(int x) {
    12     int tmp = 0x3f;
    13     for (int i = 1; i <= m; i++) {
    14         if (tmp == x % 3)
    15             return false;
    16         tmp = x % 3;
    17         x /= 3;
    18     }
    19     return true;
    20 }
    21 
    22 bool judge(int u, int v) {
    23     for (int i = 1; i <= m; i++) {
    24         if (u % 3 == v % 3)
    25             return false;
    26         u /= 3;
    27         v /= 3;
    28     }
    29     return true;
    30 }
    31 
    32 int qpow(int a, int b) {
    33     int res = 1;
    34     while (b) {
    35         if (b & 1)
    36             res *= a;
    37         a *= a;
    38         b >>= 1;
    39     }
    40     return res;
    41 }
    42 
    43 int main() {
    44     ios::sync_with_stdio(false);
    45     cin >> n >> m >> k;
    46     for (int i = 1; i <= m; i++) {
    47         int x;
    48         cin >> x;
    49         zk = zk * 3 + (x - 1);
    50     }
    51 
    52     maxx = qpow(3, m);
    53     for (int i = 0; i < maxx; i++) {
    54         if (check(i))
    55             sta[++tot] = i;
    56     }
    57     for (int i = 1; i <= tot; i++) {
    58         if (zk == sta[i]) {
    59             pos = i;
    60             break;
    61         }
    62     }
    63     if (!pos) {  //第k行本身就不符合条件
    64         cout << "0" << '
    ';
    65         return 0;
    66     }
    67     for (int i = 1; i <= n; i++) {
    68         if (i == k) {  //此行状态已经固定
    69             if (i == 1)
    70                 f[i][pos] = 1;
    71             else {
    72                 for (int j = 1; j <= tot; j++) {
    73                     if (judge(sta[pos], sta[j])) {
    74                         f[i][pos] = (f[i][pos] + f[i - 1][j]) % mod;
    75                     }
    76                 }
    77             }
    78         } else {
    79             for (int j = 1; j <= tot; j++) {  //此行状态没有固定,所以多一重循环
    80                 if (i == 1)
    81                     f[i][j] = 1;
    82                 else {
    83                     for (int k = 1; k <= tot; k++) {
    84                         if (judge(sta[k], sta[j])) {
    85                             f[i][j] = (f[i][j] + f[i - 1][k]) % mod;
    86                         }
    87                     }
    88                 }
    89             }
    90         }
    91     }
    92     for (int i = 1; i <= tot; i++) ans = (ans + f[n][i]) % mod;
    93     cout << ans << '
    ';
    94     return 0;
    95 }
  • 相关阅读:
    堆(优先队列)模板
    线段树(递归)模板
    快速幂(含二阶方阵类)模板
    ACM/CF赛制getstart模板
    [Andrew Stankevich's Contest#21] Lempel-Ziv Compression
    [NOIP2001]Car的旅行路线
    [NOIP2007] 矩阵取数游戏
    [NOIP2010] 关押罪犯
    [NOIP1999] 拦截导弹
    设计模式之第1章-工厂方法模式(Java实现)
  • 原文地址:https://www.cnblogs.com/wsy107316/p/13280929.html
Copyright © 2011-2022 走看看