• Inclusion–exclusion principle(动态规划)


    QUESTION:

    把(2, 3, 5, 7)称为primes,能被primes整除的我们称之为Walprimes,比如 

    -21, -30, 0, 5, 14 是, 而-121, 1, 143 etc不是Walprimes。现在给一个由数字组成的字符串,请在数字之间用+,或-,或什么符号都不用,来组成一个表达式。判断有多少个表达式的值是Walprimes。
    SOLUTION:
    首先,使用Inclusion–exclusion principle。F(s,{2, 3, 5, 7}) 表示从字符串s有Walprimes的数量。那么F(i,{2, 3, 5, 7}) = F(s, 2) + F(s, 3) + F(s, 5) + F(s, 7)
           - F(s, 2 * 3) - F(s, 2 * 5) - F(s, 2 * 7) - F(s, 3 * 5) - F(s, 3 * 7) - F(s, 5 * 7)
           + F(s, 3 * 5 * 7) + F(s, 2 * 5 * 7) + F(s, 2 * 3 * 7) + F(s, 2 * 3 * 5)
           - F(s, 2 * 3 * 5 * 7)
    其次我们使用动态规划求F。R[i][j]表示字符串在i位置之后,j是被primes除余数是j。
    int void F(string s, int prime){
        int R[s.length()][prime];
        memset(R, 0, sizeof(R));
        for(int i= s.length()-1;i>=0; i--){
           int first = s[i] - '0';
           for(int k = i+1; k < s.length(); j++){ //对R的第一维进行遍历
               for(int j = 0; j < primes; j ++){ //对R的第二维进行遍历
                   R[i][j] += R[k][(prime+(j-first)%prime)%prime]; //i+...
                   R[i][j] += R[k][(prime+(i-first)%prime)%prime]; //i-...
               }
               first = 10*first +s[k]; //i后面既没+也没-
            }
            R[i][first % p] += 1; //最后一个first
        }
        return return R[0][0];
    }
    
    int walprimes(const string& s) {
        return F(s, 2) + F(s, 3) + F(s, 5) + F(s, 7)
           - F(s, 2 * 3) - F(s, 2 * 5) - F(s, 2 * 7) - F(s, 3 * 5) - F(s, 3 * 7) - F(s, 5 * 7)
           + F(s, 3 * 5 * 7) + F(s, 2 * 5 * 7) + F(s, 2 * 3 * 7) + F(s, 2 * 3 * 5)
           - F(s, 2 * 3 * 5 * 7);
    }
  • 相关阅读:
    MT【305】丹德林双球
    MT【304】反射路径长度比
    MT【303】估计
    MT【302】利用值域宽度求范围
    MT【301】值域宽度
    MT【300】余弦的三倍角公式
    MT【299】对数型数列不等式
    MT【298】双参数非齐次
    xadmin 自定义actions
    xadmin 添加自定义权限
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4843350.html
Copyright © 2020-2023  润新知