題意:給你n次敲鍵盤的機會,給定字串s,讓你敲出這個**的方案數的。
輸入只有0 、1或者 退格鍵(backspace).
題解:在此之前真的要感謝一下sqy學長。
要是沒有他每天寫的部落格,我還真不知道有些題是怎麼寫出來的。在此膜拜一遍。
需要用到 dp[0~n][0~len]---第一維指的是:第n次敲鍵盤,len是當前的長度。
輸入 0或1 是:dp[i+1][j+1]=dp[i][j]+dp[i+1][j+1];
退格鍵(backspace): dp[i+1][j-1]=dp[i][j]+dp[i+1][j-1];
為什麼標記為紅色呢:因為當j==0時會越界。所以max(j-1,0);
還有一點要注意。
推出了dp[n][len]後,因為要得到這個字串只有一種情況,而我們是0或1亂來了
所以 ans=(dp[n][len])/(qpow(2,len));
運用費馬小定理:qpow(qpow(2,len),mod-2);
ans=dp[n][len]*qpow(qpow(2,len),mod-2);
這題還需要mod 防爆。
再次感謝sqy學長要不然這題一直做不出來。
貼上**:
#include#define max(a,b) (a)>(b)?(a):(b)
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll qpow(ll a,int b)return ans;
}int dp[5050][5050]=;
int n,len;
char s[5050];
int main()
}/*for(int i=0;i<=4;i++)
}*/int ans=(int)(qpow(qpow(2,len),mod-2)*dp[n][len]%mod);
printf("%d\n",ans);
return 0;
}
Prince and Princess 動態規劃
題目大意 求兩個序列的最長子序列 include include include includeusing namespace std int n,p,q const int maxn 250 250 int num1 maxn int hash maxn stack maxn int main i...
Colored Rectangles 動態規劃
題意 三種木棍,分別有 r對 g對 b對兩種不同木棍對可以弄移乙個矩形,要求矩形面積總和最大 思路 看題面,這種幾個變數互相影響並且最終目標固定的題目感覺就要用dp,而且資料比較小應該就是能用三維dp,雖然我比賽時沒做出來,但是我想的挺明白的,狀態轉移就是dp i j k max dp i 1 j ...
hdu1513 Palindrome 動態規劃
求讓乙個字串變為回文串所需最少插入字元數 定義狀態dp i j 表示從左到右i個字元,從右到左j個字元,要讓他們回文需要插入多少字元 顯然,a i a j 時,dp i j d p i 1 j 1 a i a j 時,就需要插入乙個字元,因此dp i j m in d p i 1 j dp i j ...