类似问题:子数组和被所有元素的个数整除。
给你一个数组,要求找出一个子数组,使得该子数组的和可以被10整除。例如,下面的数组中,子数组A[3]+A[4]+A[9] mod 10 = 0.
思路:
用动态规划。
状态空间定义如下:s(m,k)表示数组A的前m个元素中,是否存在一个子数组,该子数组的和除以10得到的余数是k。s(m,k)=true表示存在;s(m,k)=false表示不存在。
状态转移:s(m,k) = s(m-1,k) || s(m-1, (k-A[m-1]+10)%10)
设数组A总共有n个元素。那么s(n,0)就表示了所求子数组的存在性。
代码:
/* Program to find LCA of n1 and n2 using one traversal of Binary Tree */
#include <iostream>
#include <vector>
#include <string>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
bool divideBy10(int arr[], int n)
{
vector<bool> table_row(10, false);
vector<vector<bool> > table(n, table_row);
// Trivial case: sub-array is empty, 0 is dividable by any integer
// Therefore, the resulting sub-array should contain at least 1 element.
table[0][arr[0]%10]=true;// Base case: arr[0]%10
for(int i=1; i<n; i++)
for(int j=0; j<10; j++)
{
int k=j;
while(k<arr[i])
k = k+10;//make sure k is greater than or equal to arr[i]
table[i][j] = table[i-1][j] || table[i-1][ (k-arr[i])%10 ];
}
return table[n-1][0];
}
int main()
{
int arr[]={429, 334, 62, 711, 704, 763, 98, 733, 721, 995};
//int arr[]= {1,2,3,4,5};
if(divideBy10(arr, sizeof(arr)/sizeof(int)) )
cout<<"fffffffffffff"<<endl;
}