Jan 18, 2020
MST!
Edit me

#. Problem

Website

1. My approach

-

2. Solution

#include<iostream>
#include<algorithm>

using namespace std;

int ans = 0;
// is it Panlindrome, string [from][to]?
bool isP[2501][2501];
int dp[2501];

int main(){
	string s;
	cin >> s;
	
	// 자리수 맞추기
	s.insert(0," ");
	
	// 길이가 1인 자기자신은 palindrome
	for(int i = 1; i < s.size(); i++) isP[i][i] = true;

	// 길이가 2 string들에 대하여 palindrome check
	for(int i = 1; i < s.size(); i++) {
		if(s[i] == s[i+1]) isP[i][i+1] = true;
	}
	
	// 길이가 3 string들에 대하여 palindrome check
	// i 가 안에 있는 이유는, 길이가 3인것들에 대해 한바뀌 돌아야지
	// 길이가 4인것들에 대해 볼 때, isP[a][b](b-a=3) 이 업데이트되어있기때문
	for(int j = 2; j < s.size(); j++){
        	for(int i = 1; i < s.size(); i++){
			if(s[i] == s[j] && isP[i+1][j-1]) isP[i][j] = true;
		}
	}
	
	for (int i = 1; i < s.size(); i++){
		dp[i] = 2147483647;
		for (int j = 1; j <= i; j++){
			if (isP[j][i]) dp[i] = min(dp[i], dp[j - 1] + 1);
		}
	}
	
	cout << dp[s.size()-1];
	
    // while(true){
    //     int a = 0;
    //     int b = 0;
    //     scanf("%d%d",&a,&b);
        
    //     cout<< isP[a][b] << '\n';
    // }

	return 0;
}
Time - O(N^2) Space - O(N^2)
   

3. Epilogue

What I’ve learned from this exercise:

  • There’s always a way.