Codeforces 570E,DP 滾動陣列

2021-07-04 15:06:13 字數 922 閱讀 2051

題意:

給定乙個n*m的方格,每個各自節點都是乙個小寫字母(範圍『a』~'z'),現在從左上角(0,0)點出發,到右下角(n-1,m-1)點停止。

問經過的路徑,有多少條路徑上的字目可以構成回文字串。

範圍:1<=n,m<=500

題解:分析:

想象成兩個人(a和b),分別從起點和終點出發,當他倆相遇時,走過的路徑相同的走法的數量。

dp[step][i][j]:表示走了step步時,a走到第i行,b走到第j行時,走到當前位置可以形成回文串的數量。

狀態轉移:

dp[step][i][j]=dp[step-1][i-1][j]+dp[step-1][i-1][j+1]+dp[step-1][i][j+1]+dp[step-1][i][j];

還要注意的是:

最後求結果ans的時候,要考慮路徑長度的奇偶性,如果是奇數,最後兩個人停在了同一點,若是偶數,兩個人最後停的不是同乙個點

step狀態只由step-1狀態得到,所以為了節省空間,這裡採用滾動陣列的方式來進行優化。

但是滾動陣列在用的時候,要注意每次迴圈都得初始化。由於這個原因,我在這裡卡了較長時間。

**:#include#include#include#include#include#includeusing namespace std;

#define n 510

typedef long long ll;

ll mod=1000000007;

int n,m;

ll dp[2][n][n],ans;

char s[n][n];

int main()}}

}for(int i=0;i

NYOJ 570 解題報告

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 題目描述很簡單,求出 ps 上面式子的意思是大於0小於n並且能整除n的所有d的尤拉函式值之和 輸入每行乙個數n n 2 31 輸入以檔案結尾結束。輸出每個結果佔一行。樣例輸入 1 212樣例輸出 0 18這道題又是一道關於數論的...

5 70 情人節 15分

輸入按照點讚的先後順序給出不知道多少個點贊的人名,每個人名佔一行,為不超過10個英文本母的非空單詞,以回車結束。乙個英文句點.標誌輸入的結束,這個符號不算在點讚名單裡。根據點讚情況在一行中輸出結論 若存在第2個人a和第14個人b,則輸出 a and b are inviting you to din...

CodeForces 砝碼稱重

1449 砝碼稱重 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 現在有好多種砝碼,他們的重量是 w0,w1,w2,每種各乙個。問用這些砝碼能不能表示乙個重量為m的東西。樣例解釋 可以將重物和3放到乙個托盤中,9和1放到另外乙個托盤中。input 單組測試資料。...