涂色
假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。
例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。 用尽量少的涂色次数达到目标。
第一次记录区间dp,有点类似模板,最外层枚举长度,再枚举起点,接着算出总店,在区间中进行枚举二分。
#include<bits/stdc++.h> using namespace std; typedef long long int ll; const ll N=1e3+10; ll n,dp[N][310];//题意:每次可以给任意的字符涂一个色 char a[N]; int main() { cin>>a+1; n=strlen(a+1); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j)dp[i][j]=1;//当区间长度为一时的值 else dp[i][j]=1e9; } }//初始化 for(int len=2;len<=n;len++)//阶段:区间长度 { for(int l=1;l<=n-len+1;l++)//状态:枚举左端点 { int r=l+len-1; //状态:右端点 if(a[l]==a[r])dp[l][r]=dp[l+1][r];//相当于i不用涂 for(int k=l;k<r;k++)//决策 :找出最小次数 { dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]); } } } cout<<dp[1][n]<<endl; return 0; }

浙公网安备 33010602011771号