Skip to content

Commit 2c921af

Browse files
author
Sethi
committed
Added ROCK from SPOJ
1 parent a41a159 commit 2c921af

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

ROCK/problem.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
https://www.spoj.com/problems/ROCK/
2+
3+
#dynamicprogramming

ROCK/rock.cpp

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/*
2+
***************************************************************************************************************
3+
4+
Author : SUBHENDU SETHI
5+
Hackerrank Handle: subhendu_sethi
6+
Codechef Handle: subhendu_sethi
7+
SPOJ Handle: codekatte
8+
Codeforces Handle: subhendu_sethi
9+
UVA Handle: codekatte
10+
11+
**************************************************************************************************************
12+
*/
13+
#include <bits/stdc++.h>
14+
using namespace std;
15+
16+
#define ll long long
17+
#define si(x) scanf("%d",&x)
18+
#define sl(x) scanf("%lld",&x)
19+
#define slu(x) scanf("%llu",&x)
20+
#define sd(x) scanf("%lf",&x)
21+
#define sc(x) scanf("%c",&x)
22+
#define ss(x) scanf("%s",x)
23+
#define vl vector<ll>
24+
#define vi vector<int>
25+
#define pb push_back
26+
#define MOD 1000000007
27+
#define MAXN 105050
28+
#define SQRT 330
29+
#define ls (node<<1)
30+
#define rs ((node<<1)+1)
31+
#define ii pair<int,int>
32+
#define F first
33+
#define S second
34+
#define f(i,a,b) for(int i=a;i<b;i++)
35+
ll dp[250][250];
36+
char S[250];
37+
ll n,t;
38+
ll num0[250];
39+
ll num1[250];
40+
inline void refresh()
41+
{
42+
memset(dp,-1,sizeof(dp));
43+
memset(num0,0,sizeof(num0));
44+
memset(num1,0,sizeof(num1));
45+
}
46+
inline void read()
47+
{
48+
sl(t);
49+
}
50+
ll rec(int a, int b)
51+
{
52+
if(dp[a][b] != -1){
53+
return dp[a][b];
54+
}
55+
else if(a>b){
56+
return dp[a][b] = 0;
57+
}
58+
else if(a == b)
59+
{
60+
if(S[a] == '0')
61+
return dp[a][b] = 0;
62+
return dp[a][b] = 1;
63+
}
64+
else
65+
{
66+
ll tot0 = num0[b];
67+
ll tot1 = num1[b];
68+
if(a!=0){
69+
tot0-=num0[a-1];
70+
tot1-=num1[a-1];
71+
}
72+
if(tot1>tot0)
73+
return dp[a][b] = (b-a+1);
74+
else
75+
{
76+
ll ret = 0;
77+
for(int i=a;i<b;i++)
78+
{
79+
ret = max(ret,rec(a,i)+rec(i+1,b));
80+
}
81+
return dp[a][b] = ret;
82+
}
83+
}
84+
}
85+
inline void solve()
86+
{
87+
while(t--)
88+
{
89+
refresh();
90+
sl(n);
91+
scanf("%s",S);
92+
f(i,0,n)
93+
{
94+
if(S[i] == '0')
95+
num0[i]=1;
96+
else
97+
num1[i]=1;
98+
}
99+
f(i,1,n)
100+
{
101+
num0[i]+=num0[i-1];
102+
num1[i]+=num1[i-1];
103+
}
104+
ll ans = rec(0,n-1);
105+
printf("%lld\n",ans);
106+
}
107+
}
108+
int main()
109+
{
110+
read();
111+
solve();
112+
return 0;
113+
}

0 commit comments

Comments
 (0)