【CodeForces - 608D】Zuma(区间dp)
題干:
Genos recently installed the game Zuma on his phone. In Zuma there exists a line of?n?gemstones, the?i-th of which has color?ci. The goal of the game is to destroy all the gemstones in the line as quickly as possible.
In one second, Genos is able to choose exactly one continuous substring of colored gemstones that is a palindrome and remove it from the line. After the substring is removed, the remaining gemstones shift to form a solid line again. What is the minimum number of seconds needed to destroy the entire line?
Let us remind, that the string (or substring) is called?palindrome, if it reads same backwards or forward. In our case this means the color of the first gemstone is equal to the color of the last one, the color of the second gemstone is equal to the color of the next to last and so on.
Input
The first line of input contains a single integer?n?(1?≤?n?≤?500)?— the number of gemstones.
The second line contains?n?space-separated integers, the?i-th of which is?ci?(1?≤?ci?≤?n)?— the color of the?i-th gemstone in a line.
Output
Print a single integer?— the minimum number of seconds needed to destroy the entire line.
Examples
Input
3 1 2 1Output
1Input
3 1 2 3Output
3Input
7 1 4 4 2 3 2 1Output
2Note
In the first sample, Genos can destroy the entire line in one second.
In the second sample, Genos can only destroy one gemstone at a time, so destroying three gemstones takes three seconds.
In the third sample, to achieve the optimal time of two seconds, destroy palindrome?4 4?first and then destroy palindrome?1 2 3 2 1.
題目大意:
? ?給一個數字串,如果是回文串就能相消(類似Zuma游戲),問你要想消除所有的數字,至少需要多少次操作。
解題報告:
? ?跟那道AtCoder - 4244很像,,直接遞推。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; const int INF = 0x3f3f3f3f; int a[MAX]; int dp[550][550]; int main() {int n;cin>>n;for(int i = 1; i<=n; i++) scanf("%d",a+i);memset(dp,INF,sizeof dp);for(int len = 1; len<=n; len++) {for(int l = 1; l<=n-len+1; l++) {int r = l+len-1;if(l == r) dp[l][l] = 1;if(r-l==1) dp[l][r] = 1+(a[l]!=a[r]);else {for(int k = l+1; k<=r; k++) dp[l][r] = min(dp[l][r] , dp[l][k-1] + dp[k][r]);if(a[l] == a[r]) dp[l][r] = min(dp[l][r],dp[l+1][r-1]);}}}printf("%d\n",dp[1][n]);return 0 ;}?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【CodeForces - 608D】Zuma(区间dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CodeForces - 260B 】
- 下一篇: 十年前的游戏“负心汉” 如今挂帖找寻他的