Inclusion–exclusion principle(动态规划)
2015-09-28 09:57
197 查看
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。
把(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); }
相关文章推荐
- 为什么C++中空类和空结构体大小为1?(转载)
- 如何在虚拟机外面换内核
- 如何让CentOS启动输出详细的硬件初始化信息
- QEMU内存管理之生成FlatView内存拓扑模型过程分析(基于QEMU2.0.0)
- 如何查看系统中都注册了哪些MemoryRegion(QEMU2.0.0)
- MemoryRegion模型原理,以及同FlatView模型的关系(QEMU2.0.0)
- QEMU内存管理之FlatView模型(QEMU2.0.0)
- QEMU的AddrRange地址空间对象模型算法总结(QEMU2.0.0)
- QEMU的128位算法集合(基于QEMU2.0.0)
- QEMU中VCPU线程间的IPI发送核间中断(基于QEMU2.0.0)
- 通过KVM_SET_USER_MEMORY_REGION操作虚拟机内存(Kernel 3.10.0 & qemu 2.0.0)
- Samba服务器的配置
- ARM SERVER 虚拟机挂载多块磁盘问题的解决方法
- eclipse 如何将maven target目录排除在搜索结果之外?
- QEMU VCPU线程同步机制之QemuCond(基于QEMU2.0.0)
- Linux 新api eventfd
- KVM源代码分析1:基本工作原理
- select(poll)实现代码实现分析(基于kernel 3.10.0)
- select(poll)实现代码实现分析(基于kernel 3.10.0)
- 安卓优化