1. 程式人生 > >2016藍橋杯省賽java C組第十題 --密碼脫落

2016藍橋杯省賽java C組第十題 --密碼脫落

暑假以來刷藍橋杯題,實在被暴力所折服,終於碰到一眼前一亮的題~~~

第一篇線上的部落格,開寫~~~

密碼脫落


X星球的考古學家發現了一批古代留下來的密碼。
這些密碼是由A、B、C、D 四種植物的種子串成的序列。
仔細分析發現,這些密碼串當初應該是前後對稱的(也就是我們說的映象串)。
由於年代久遠,其中許多種子脫落了,因而可能會失去映象的特徵。


你的任務是:
給定一個現在看到的密碼串,計算一下從當初的狀態,它要至少脫落多少個種子,才可能會變成現在的樣子。

-----------------------------------
輸入一行,表示現在看到的密碼串(長度不大於1000)
要求輸出一個正整數,表示至少脫落了多少個種子。


例如,輸入:
ABCBA
則程式應該輸出:
0


再例如,輸入:
ABDCDCBABC
則程式應該輸出:
3


資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 3000ms




請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。


所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。

-----------------------------------

冷不丁一看好難的一道題,詳細地考慮後決定從兩端開始比較,搞清楚幾種情況,問題就迎刃而解了~

package lanqiaobei;
import java.io.*;
import java.util.Scanner;
public class mimatuoluo {
//static int num = 0;
static char a[];
//static int len = a.length;
public static int f(int left,int right){
	int num = 0;
	if(left>=right)
		return num;
	if(a[left] == a[right])
		num = f(left+1,right-1);
	else if(a[left] == a[right-1])
		num = f(left,right-1) + 1;
	else if(a[left+1] == a[right])
		num = f(left+1,right) + 1;
	else {
		num = (f(left,right-1)+1)<(f(left,right-1)+1)?(f(left,right-1)+1):(f(left,right-1)+1);
	}
	
	return num;
}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner s = new Scanner(System.in);
		String str = s.nextLine();
		a = str.toCharArray();
		int len = a.length;
		System.out.println(f(0,len-1));
	}

}