用d[i-1]表示前i-1個字母可以轉化成的字串的種類數,那麼d[i]一定是》=d[i-1]的,因為如果str[i]是1——9,那麼d[i]=d[i-1],如果str[i-1]和str[i]構成一個1-26之間的數(並且str[i+1]!='0',因為如果str[i+1]=='0',那麼它一定是和str[i]一起組成了一個數),d[i]=d[i-1]+d[i-2].另外還要避免1205這樣的串中05不能算一個數,0隻能和2構成20.
比賽時做讀完這個題,感覺一般的類比過不了,就放過去了,結果發現就是個類比題,按照題目意思做就可以了,另外要注意n要開方,否則會逾時。#include<cstdio>#include<cstring>#include<iostream>using namespace std;int n,m,digit[100];int ans;void comp(int a){ int aa=a;
比賽時想了倆小時都沒有想出來,當時只是想用dfs暴搜,好不容易寫出來了才發現用unsigned long long都存不下,沒想到其實找到規律大數乘法就行了。規律:2 3 7 43 1807
m*n=p並且m,n都是素數,那麼一定是m,n一個比sqrt(p)大,一個比sqrt(p)小,或者m==n==sqrt(p),所以構造素數表時判斷到sqrt(10^9)即可。#include<cstdio>#include<iostream>#include<set>using namespace std;int isprime(int n){ for(int i=2; i*i<=n; i++)
題意配上插圖很直白,但是由於資料量大,要最佳化,這個題是的線段樹的模板題,看了好長時間也沒看懂,學習別人的代碼,用離散化做的。 把所有區間端點離散到一條數軸上,用數組x[ ]存,(x[a]=b表示數軸上第a+1個點值是b)然後排序,去重(unique函數),剩下len個點。對於每一個區間,找到區間兩個端點在數軸上的位置a1和a2,用數組f[ ]標記,f[i]=j表示數軸上第i+1個點是海報j.
十分佩服DC學長,問他遞推公式怎麼得到的,他說他在紙上一划拉就劃拉出來了,好吧。。。。。不過在他的指點下,還有題解的協助下,我又仔細想了想,終於把這道題悟出來了。1.一次遞推出1——2,1——4,……1——2^k所需的步驟,這個可以找規律的。 k=1時,即1——2, 步數:0 k=2時,即1——4, 步數:1 k=3時,即1——8, 步數:4 k=4 時,即1——16, 步數:11 k=5時,
真是個奇葩的題目!卡了N次。 1.並不一定是連續的子串,這個題相當於從n個數中挑出合格數。 2.很容易逾時,我逾時的原因是用了 maxx=max(maxx,num);而換成 maxx=maxx>num?maxx:num;就不會逾時。
剛看到這個題時還以為是用動規求最長公用子列的方法做,其實只要一個for枚舉判斷迴圈的長度就可以了。想複雜了。。。。。。。。#include<cstdio>#include<cstring>#include<iostream>#define MAXN 500010using namespace std;int main(){ //freopen("in.txt","r",stdin); char a[MAXN],
還是讀題理解題意是個大問題,這個題告訴你不斷的告訴你一些區間,然後如果兩個區間(a,b)(c,d)滿足 c < a < dorc < b < d. 那麼這兩個區間就是連通的,如果區間1和2
LRJ演算法競賽入門經典P189,移動n個圓盤所需步數f(n)=2f(n-1)+1;同時f(n)=2^n-1.用A B
這個題和UVA10700http://blog.csdn.net/anqier0468/article/details/9087283很相似,10700每個數範圍是1——20,所以最大的數就是先加後乘,而這個題有0的情況,所以10700進棧出棧的方法就不合適了。CDC用的DP,狀態轉移方程很巧妙。用maxx[i][j]表示起點在i終點在j的部分的最大值,狀態轉移方程,maxx[i][j]=max{maxx[i][k] operator(+,*) maxx[k+1][j}
動規,求非連續的單調遞增的最長子序列的長度。 狀態轉移方程:d[i]=d[a]+1,如果num[a]<num[i]&&0<=a<=i,否則d[i]=1。一開始以為否則d[i]=d[i-1],這樣在輸出時是錯誤的,比如6008 13006000 2100500 20001000 40001100 30006000 20008000 14006000
這個題想了有兩天時間。。。。。。。。智商,IQ,,,,,,,,,,,,,,,,哎,,看了學姐的部落格,又研究了一下,下面這段話是她部落格中的:
題目連結: http://www.spoj.com/problems/PT07X/
乍一看沒什麼思路,一個n位元的平方的後9位只與這個數的後九位有關,所以寫個測試程式暴利找出滿足條件的數,發現9位的有8個,這樣10位的就有9*8=72個,11位的有10*9*8個。#include<cstdio>#include<cstring>#include<iostream>#define ULL unsigned long longusing namespace std;int main(){
這個題與http://blog.csdn.net/anqier0468/article/details/9863063狀態轉移方程是一個思路,只不過因為每兩種顏色混合會產生一個新結果,要用另一個數組儲存這個值。#include<cstdio>#include<iostream>#include<cstring>#define MAXN 103#define LL long longusing