PAT (Basic Level) Practise 1040 有几个PAT(DP)
生活随笔
收集整理的這篇文章主要介紹了
PAT (Basic Level) Practise 1040 有几个PAT(DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1040. 有幾個PAT(25)
時間限制 120 ms內存限制 65536 kB
代碼長度限制 8000 B
判題程序 Standard 作者 CAO, Peng
字符串APPAPT中包含了兩個單詞“PAT”,其中第一個PAT是第2位(P),第4位(A),第6位(T);第二個PAT是第3位(P),第4位(A),第6位(T)。
現給定字符串,問一共可以形成多少個PAT?
輸入格式:
輸入只有一行,包含一個字符串,長度不超過105,只包含P、A、T三種字母。
輸出格式:
在一行中輸出給定字符串中包含多少個PAT。由于結果可能比較大,只輸出對1000000007取余數的結果。
輸入樣例: APPAPT 輸出樣例: 2?
?
題目鏈接:PAT 1040
題意簡單就不多說了,反正看到這題感覺是用DP,因為看題目的意思又取余又計數的……然后想了一下,用dp[k][i]表示當前到i位置時收集到了P(0)、PA(1)、PAT(2)三個字符的個數。
然后感覺應該有這樣的遞推式:
dp[0][i] = (dp[0][i - 1] + 1) % mod;
dp[1][i] = (dp[1][i] + dp[0][i - 1]) % mod;
dp[2][i] = (dp[2][i] + dp[1][i - 1]) % mod;
然后交了一發居然過了,不知道是數據弱還是這個遞推式沒有問題……
代碼:
?
#include <stdio.h> #include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define LC(x) (x<<1) #define RC(x) ((x<<1)+1) #define MID(x,y) ((x+y)>>1) #define CLR(arr,val) memset(arr,val,sizeof(arr)) #define FAST_IO ios::sync_with_stdio(false);cin.tie(0); typedef pair<int, int> pii; typedef long long LL; const double PI = acos(-1.0); const int N = 1e5 + 7; const int mod = 1000000007; char s[N]; int dp[3][N];int main(void) {int i, len;while (~scanf("%s", s + 1)){CLR(dp, 0);len = strlen(s + 1);for (i = 1; i <= len; ++i){dp[0][i] = dp[0][i - 1];dp[1][i] = dp[1][i - 1];dp[2][i] = dp[2][i - 1];if (s[i] == 'P')dp[0][i] = (dp[0][i - 1] + 1) % mod;else if (s[i] == 'A')dp[1][i] = (dp[1][i] + dp[0][i - 1]) % mod;else if (s[i] == 'T')dp[2][i] = (dp[2][i] + dp[1][i - 1]) % mod;}printf("%d\n", dp[2][len]);}return 0; }?
轉載于:https://www.cnblogs.com/Blackops/p/6257790.html
總結
以上是生活随笔為你收集整理的PAT (Basic Level) Practise 1040 有几个PAT(DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回溯算法之迷宫问题
- 下一篇: ar - 创建静态库.a文件