Sequence Finder
Given two arrays A and B of equal size, you have to determine whether the following the sequence is possible or not.
i.e for n=2, out of the sequences –
- A[0] + A[1]
- A[0] – B[1]
- – B[0] + A[1]
- – B[0] – B[1]
Whether a sequence with 0 (zero) value is possible or not.
Solution:
The question may look hard at first, but the solution just requires some modeling. Let’s see with the help of an example, suppose we have n=4 and the following sequence has value zero,
A[0] – B[1] – B[2] + A[3] = 0
Now take the B[ ] terms to RHS
A[0] + A[3] = B[1] + B[2]
Now add the missing A[ ] terms with same indices as B[ ] to both sides
A[0] + A[1] + A[2] + A[3] = A[1] + B[1] + A[2] + B[2]
Or
A[0] + A[1] + A[2] + A[3] = ( A[1] + B[1] ) + ( A[2] + B[2] )
Or
A[0] + A[1] + A[2] + A[3] = T[1] + T[2] (Here- T[i]=A[i]+B[i])
Or
Summation of A[ ] = Summation of some terms of T[ ]
Or
Summation of A[ ] (CONSTANT) = Summation of a subset of T[ ]
Thus we have reduced our complicated summation problem to a problem of Subset Sum problem which can solved using Dynamic programming. To see solution of Subset sum problem using Dynamic Programming click here.
So, to implement this we need to the summation of A[ ] in a variable say sum and create a array T such that T[i] = A[i] + B[i].
NOTE- We can also add missing B[ ] terms in place of A[ ] terms, in that case we would be storing summation of B[ ] and T would be same.
Code for Sequence Finder
Implemented in C++
#include <bits/stdc++.h> #define ll int64_t #define MX 1000007 #define MX1 1003 using namespace std; int t[MX],dp[MX]; // Here t stores the set and dp stores whether ith element is possible or not i.e if dp[i]=1 then it is possible or not bool subset_sum(int n,int sum){ // this function is used to determine whether the subset with sum is possible or not dp[0]=1; for(int i=0;i<n;i++){ if(t[i]<=sum) for(int j=sum;j>=t[i];j--){ dp[j]|=dp[j-t[i]]; } } return dp[sum]; } int main() { int n,sum=0; cin>>n; for(int i=0;i<n;i++){ cin>>t[i]; // here we input array A sum+=t[i]; // and store its sum of elements } for(int i=0;i<n;i++){ int a;cin>>a; // here we input array B and add it to existing array T i.e A t[i]+=a; } (subset_sum(n,sum))?cout<<"Possible":cout<<"Not Possible"; return 0; }
Example
Sequence Finder Dynamic Programming Article is Published by Arnab Ghosh.
If you want to be a content writer with Gohired.in, please write at career@gohired.in or at admin@gohired.in.