- P4170 [CQOI2007]涂色
- 思路 :理解为“把一段连续的区间改成一个定值
- 当
i!=j
且s[i]==s[j]
时,可以想到只需要在首次涂色时多涂一格即可,于是f[i][j]=min(f[i][j-1],f[i+1][j])
- 当
i!=j
且s[i]!=s[j]
时,我们需要考虑将子串断成两部分来涂色,于是需要枚举子串的断点,设断点为k
,那么f[i][j]=min(f[i][j],f[i][k]+f[k+1][j])
- 记忆化实现:
-
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f int len,ans,dp[55][55]; string str; int dfs(int l,int r) { if(l==r) return dp[l][r]=1; if(dp[l][r]!=-1)return dp[l][r]; int tmp=inf; if(str[l]==str[r]) tmp=min(dfs(l,r-1),dfs(l+1,r)); else { for(int k=l; k<r; k++) tmp=min(tmp,dfs(l,k)+dfs(k+1,r)); } return dp[l][r]=tmp; } int main() { memset(dp,-1,sizeof(dp)); cin>>str; len=str.size(); ans=dfs(0,len-1); printf("%d\n",ans); return 0; }
P4170 [CQOI2007]涂色-区间DP
最新推荐文章于 2022-05-26 08:32:26 发布