题目链接
Recently Vasya found a golden ticket — a sequence which consists of n digits a1a2…an
. Vasya considers a ticket to be lucky if it can be divided into two or more non-intersecting segments with equal sums. For example, ticket 350178
is lucky since it can be divided into three segments 350
, 17
and 8
: 3+5+0=1+7=8
. Note that each digit of sequence should belong to exactly one segment.
Help Vasya! Tell him if the golden ticket he found is lucky or not.
Input
The first line contains one integer n (2≤n≤100
) — the number of digits in the ticket.
The second line contains n digits a1a2…an (0≤ai≤9
) — the golden ticket. Digits are printed without spaces.
Output
If the golden ticket is lucky then print “YES”, otherwise print “NO” (both case insensitive).
input
5
73452
output
YES
input
4
1248
output
NO
Note
In the first example the ticket can be divided into 7
, 34
and 52
: 7=3+4=5+2
.
In the second example it is impossible to divide ticket into segments with equal sum.
题解:dp
令dp[j]表示当前段在第j个位置结束每一段的和为i能否成立。
枚举段和i,对于每个j,若存在k使得 sum[j]-sum[k-1]==i 且 dp[k-1]==true,则f[j]=true,其中sum为关于序列a的前缀和
#include<bits/stdc++.h>
using namespace std;
int n,dp[105],sum[105];
int main(){
//不能加ios :: sync_with_stdio(false);cin.tie(0); 加了就wacin >> n;for(int i = 1;i <= n;i++){
scanf("%1d",&sum[i]);sum[i] += sum[i - 1];} for(int i = 0;i < sum[n];i++){
//注意不能枚举到n,否则的话就没有"NO"这种情况memset(dp,false,sizeof dp);dp[0] = true;for(int j = 1;j <= n;j++){
for(int k = j;k;k--){
if(dp[k - 1] == true && sum[j] - sum[k - 1] == i){
dp[j] = true;break;}}}if(dp[n] == true){
cout << "YES" << endl;return 0;}}if(sum[n] == 0){
//如果全部都是0cout << "YES" << endl;return 0;} cout << "NO" << endl;return 0;
}