Hi,
I am trying spoj.pl/problems/ROCK/
The 1st code below gives WA and the 2nd TLEs.
Anyone please explain what I am missing.
Thank you.
Code 1:
#include <vector>
#include <stack>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <set>
#include <cmath>
using namespace std;
#define GI ({int t ;scanf("%d",&t);t;})
#define FORZ(i,n) for(typeof(n)i=0;i<n;i++)
#define all(x) (x).begin(),(x).end()
#define PB push_back
#define sz size()
#define FF first
#define SS second
typedef vector<int> VI;
typedef pair<int,int> pII;
typedef vector<string> VS;
typedef long long LL;
int n;
string s;
int dp[202][202];
int solve (int p, int diff, int len)
{
if (p == n)
return (diff > 0) ? len : 0;
if (dp[p][diff] != -1)
return dp[p][diff];
int a = 0, b = 0, c = 0;
if (s[p] == '1')
{
// include the '1' to the current segment
a = solve (p + 1, diff + 1, len + 1);
// break at this point and start a new segment at this point (p)
if (diff > 0) b = len + solve (p + 1, 1, 1);
return dp[p][diff] = max (a, b);
}
else
{
// break at this point and start a new segment at (p + 1) discarding the '0'
if (diff >= 0) a = len + solve (p + 1, 0, 0);
// include the '0' to the current segment
b = solve (p + 1, diff - 1, len + 1);
// break at this point and start a new segment at this point (p)
if (diff >= 0) c = len + solve (p + 1, -1, 1);
return dp[p][diff] = max (a, max (b, c));
}
}
int main ()
{
int t = GI;
while (t --)
{
cin >> n >> s;
FORZ (i, 202)
FORZ (j, 202)
dp[i][j] = -1;
int ans = solve (0, 0, 0);
printf ( "%d\n", ans );
}
return 0;
}
Code 2:
#include <vector>
#include <stack>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <set>
#include <cmath>
using namespace std;
#define GI ({int t ;scanf("%d",&t);t;})
#define FORZ(i,n) for(typeof(n)i=0;i<n;i++)
#define all(x) (x).begin(),(x).end()
#define PB push_back
#define sz size()
#define FF first
#define SS second
#define MP make_pair
typedef vector<int> VI;
typedef pair<int,int> pII;
typedef vector<string> VS;
typedef long long LL;
#define MAX 40001
int n, size;
string s;
vector <pII> vec;
int dp[MAX];
int solve (int p, int len)
{
if (p == size - 1) return len;
if (dp[p] != -1) return dp[p];
int ret = 0;
for (int nxt = p + 1 ; nxt < size ; nxt ++)
{
if (vec[nxt].FF < vec[p].SS) continue;
int v = vec[nxt].SS - vec[nxt].FF + 1;
if (vec[nxt].FF == vec[p].SS) v --;
ret = max ( ret, solve ( nxt, len + v ) );
}
return dp[p] = max (len, ret);
}
int main ()
{
int t = GI;
while (t --)
{
cin >> n >> s;
vec.clear();
FORZ (i, n)
{
for (int j = i ; j < n ; j ++)
{
int diff = 0;
for (int k = i ; k <= j ; k ++)
diff += (s[k] == '1') ? 1 : -1;
if (diff > 0) vec.PB ( MP (i, j) );
}
}
vec.erase ( unique ( all(vec) ), vec.end() );
if (vec.empty())
{
printf ( "0\n" );
continue;
}
size = (int)vec.sz;
int ans = 0;
for (int st = 0 ; st < size ; st ++)
{
memset (dp, -1, sizeof dp);
int val = solve ( st, vec[st].SS - vec[st].FF + 1 );
ans = max ( ans, val );
}
printf ( "%d\n", ans );
}
return 0;
}