题目链接:
题目大意:popo要将给定数量的灯变成自己想要的颜色,有一种魔法开关,可以将一连串的灯同时变成同一个颜色。给定灯的数量和popo想要实现的状态,求最小步数
Sample Input
5RGBGR4RGRG7ABACADA0
Sample Output
334
分析:令f[x][y]表示从第 x 个灯到第 y 个灯变成目标状态的最小花费,则初始时为最大值。而f[x][x]=1。
则f[x][y] =min{ f[x][k-1]+f[k][y] | x<k<y}
当第x,y个灯的目标状态是同一颜色时,就可以一次性将2个灯变成想要的状态
代码如下:
1 # include2 # include 3 # include 4 #define MAX 0xFFFFFF 5 using namespace std; 6 char str[51]; 7 int f[51][51],n; 8 int dfs(int x,int y) 9 {10 int i;11 int min=y-x+1,temp;12 for(i=x+1; i<=y; i++)13 {14 if(f[x][i-1]==MAX)15 f[x][i-1]=dfs(x,i-1);16 17 if(f[i][y]==MAX)18 f[i][y]=dfs(i,y);19 20 if(min>f[x][i-1]+f[i][y])21 min=f[x][i-1]+f[i][y];22 }23 if(str[x]==str[y])24 {25 if(x+1 temp)35 min=temp;36 if(y-1>0)37 {38 if(f[x][y-1]==MAX)39 temp=dfs(x,y-1);40 else41 temp=f[x][y-1];42 }43 else44 temp=1;45 if(min>temp)46 min=temp;47 if(x+1 0)48 {49 if(f[x+1][y-1]==MAX)50 temp=dfs(x+1,y-1)+1; //额外增加一步将x,y2个灯变成目标状态的步骤51 else52 temp=f[x+1][y-1]+1;53 }54 else55 temp=1;56 if(min>temp)57 min=temp;58 }59 f[x][y]=min;60 return f[x][y];61 62 }63 int main ()64 {65 int i,j;66 while(scanf("%d",&n) && n)67 {68 scanf("%s",str);69 for(i=0; i
OJ返回”Non-zero Exit Code“这种错误,是因为最后没有写return 0;或者写成了return 1;之类的,只要改成return 0;就可以了