思路借鉴楼下Joseph1314, 发现其中有些问题更正一下:

代码的初始化有些许问题,f[k][0]即s串有k位, t串没有字符时,是由可能为true的,但是其代码没有对这一部分进行初始化。详情见代码即注释。

// Problem: 删括号
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/problem/21303
// Memory Limit: 2 MB
// Time Limit: 21303000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>


using namespace std;
typedef long long LL;
const int N = 110;

char s[N], t[N];
bool f[N][N];


void f_init()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

}

int main()
{
	f_init();
	cin >> s + 1 >> t + 1;
	
	int slen = strlen(s + 1), tlen = strlen(t + 1);
	
	
	t[0] = '@'; //t 为空串时,s[k] (k != 0) 不可能相等。故初始化为‘@’;
	f[0][0] = true;
	 
	for(int i = 1; i <= slen; i ++)
	for(int j = 0; j <= tlen; j ++) // 循环从0开始,这样可以初始化其中f[k][0] 为true的部分
	{
		if(s[i] == t[j]) f[i][j] |= f[i - 1][j - 1];
		if(s[i] == ')')
		{
			int k = i - 1;
			int cnt = 1;
			while(k > 0 && cnt > 0)
			{
				if(s[k] == ')')cnt ++;
				else cnt --;
				k --;
			}
			f[i][j] |= f[k][j];
		}
	}
	
	if(f[slen][tlen]) cout << "Possible" << endl;
	else cout << "Impossible" << endl;
}