前言
這題是前天,對,沒錯前天的模擬賽做到的。然而我今天才訂正完。
題面
條形碼是一種由亮條(light bar)和暗條(dark bar)交替出現且以暗條為起頭的符號,每條都占有若干個單位寬。圖33-1給出了乙個含有4個條的條形碼它延續了1+2+3+1=7單位的寬 。
一般情況下bc(n,k,m)是乙個包含所有由k個條總寬度正好為n個單位,每個條的寬度至多為m個單位性質的條形碼組成的集合。
例如:圖33-1的條形碼屬於bc(7,4,3)而不屬於bc(7,4,2)。
圖33-2顯示了集合bc(7,4,3)中的所有16個符號,其中1表示暗,0表示亮。
圖中所示條形碼已按字典順序排列冒號左邊數字為條形碼碼的編號,圖33-1的條形碼在bc(7,4,3)書的編為4。
輸入
輸入的第一行為n、k、m的值(1≤n,k,m≤33)。
第二行為數字s(0≤s≤100),而後的s行中,每行為乙個圖33-2那樣描述的集合bc(n,k,m)中的乙個條形碼。
輸出
你的程式應完成任務
第一行是bc(n,k,m)中條形碼的個數
第二行起的s行中,每一行是輸入檔案對應條形碼的編號;輸入與輸出資料中同一行相鄰兩個數之間用空格區分。
分析
§ 1 列舉?
理論上可行,但因為有每條寬上線m的限制,因此列舉時並不只是像生成全排列那樣簡單,需要注意的細節很多。
§ 2 換個思路
我們考慮一下類似於canter expansion的思路,就是說把當前要求的條形碼序列分解,然後求之前總的條形碼個數,也就是當前的編號。(如何詳細描述呢?我也不是很好表達,不明白的同學可以去看一下關於canter expansion的文章)
§ 3 動態規劃
沒錯,我們用dp來求那個「之前總的條形碼個數」。
設dp[i][j][k][x]表示由j個條總寬度正好為i個單位,首條的顏色為x,寬度為k個單位的條形碼的編號。
則有dp[i][j][k][x] = ∑dp[i - 1][j][k - 1][x] + ∑dp[i - 1][j - 1][l][!x]
其中1 ≤ l ≤ m, !x表示與x相反的顏色。
參考**
要點均注在注釋中
#include const總結這題的滿分思路比較難考慮到,說實話暴力都很難寫,我也是看了dalao的ac**才明白的。int maxn = 35
;int n, k, m, s, dp[maxn][maxn][maxn][2
];char
str[maxn];
void
init();
intmain()
if (str[j] == str[j - 1]) len++;
else cnt++, len = 1
; }
printf(
"%d\n
", ans);
}return0;
}void
init()
}
重點呢在於你把編號轉換成方案數,再匯出這個轉移方程的過程。
當然這篇部落格不得不說我寫得有些含糊,當然我自己明白,可是我是真的表達不出來。
識別條形碼
問題描述 計算機學院2013級的院草語文難同學是軟院院花牟黑黑愛慕的物件,因此牟黑黑經常約楠神去逛街,楠神不喜歡陪牟黑黑逛街,但是不得不從啊。所以在牟黑黑逛街的時候他就無聊的用眼睛識別條形碼 在生活中,條形碼經常用來標誌物品的資訊。條形碼是由黑白相間的條組成的。條的寬度有兩種,我們可以認為窄的代表0...
生成條形碼
一 路由 routes.maproute name home url home getbar defaults new 二 html頁 text value id codenum button value 生成條形碼 onclick wds createbar width 200px height ...
條形碼生成
生成條形碼的類 public class barcode128dll set private font m valuefont new font 宋體 10 是否顯示可見號碼 如果為null不顯示號碼 public font valuefont set private byte m magnify ...