1. 程式人生 > >POJ1068 --(模擬)

POJ1068 --(模擬)

這題是在看一個書的時候的一個例題,當時並不明白啥意思,於是便找了下原題,以前沒在POJ上刷過,這是開了個頭,以後努力刷這個網站

題目大概意思是:http://poj.org/problem?id=1068

1.p序列:當出現匹配括號對時,從該括號對的右括號開始往左數,直到最前面的左括號數,就是pi的值。

2.w序列:當出現匹配括號對時,包含在該括號對中的所有右括號數(包括該括號對),就是wi的值。

要求給定加密後的p陣列,求出w陣列。

可以根據給的p陣列先求出字串s, p[i]-p[i-1]為第i個右括號緊跟在它前面的有多少個左括號,求出s,這裡用了一點小技巧,大家以後可以試試,即是括號對用01序列表示

遍歷s,每次找到右括號,然後回溯,遇到右括號就計數(回溯前找到的那個也算),直到遇到與它匹配的左括號(vis[]=false),因為一個右括號有唯一的左括號匹配,所以一旦找到它的左括號,就用vis[]=true標記下。
之前我看的是C語言程式碼,然後用java交總是錯,最後發現是陣列越界問題,改正後提交正確

import java.util.Arrays;
import java.util.Scanner;


public class Main4 {
    
    public static void main(String[] args) {
        Scanner sc 
= new Scanner(System.in); int p[]=new int [21]; int w[] = new int [21]; boolean vis[]= new boolean [42]; int t = sc.nextInt(); while(t-->0){ String s = ""; int n = sc.nextInt(); for(int i=1;i<=n;i++) p[i]
= sc.nextInt(); p[0]=0; for(int i=1;i<=n;i++){ for(int j=1;j<=p[i]-p[i-1];j++) s+="("; s+=")"; } int k=1; Arrays.fill(vis,false); for(int i=0;i<2*n;i++){ int cnt=1; if(s.charAt(i)==')'){ for(int j=i-1;j>=0;j--){ if(s.charAt(j)==')') cnt++; if(s.charAt(j)=='('&&!vis[j]) { vis[j]=true; break; } } w[k++]=cnt; } } for(int i=1;i<=n;i++) System.out.print(w[i]+" "); System.out.println(); } } }

不過看部落格有大佬這樣定義,把括號對用01序列表示,也很不錯哦,附上程式碼: http://user.qzone.qq.com/289065406/blog/1299127551