1001 Palindrome subsequence
又是会问字符串的题,比较一般的DP,注意可能存在负值的情况。
/****************************************************/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <stack>
#include <map>
#include <queue>
#include <algorithm>
#include <ctime>
#define EPS 1E-8
#define MAXN 1010
#define INF (~0U >> 2)
#define MOD 10007
using namespace std;
typedef long long LL;
/****************************************************/
char str[MAXN];
int dp[MAXN][MAXN];
int main()
{
int t, now = 0;
scanf("%d", &t);
while (t--)
{
scanf("%s", str);
int len = strlen(str);
for (int i = len - 1; i >= 0; i--)
{
for (int j = i; j < len; j++)
{
int &ret = dp[i][j] = 1;
if (i < j)
{
if (str[i] == str[j])
{
ret = dp[i][j - 1] + dp[i + 1][j] + 1;
ret %= MOD;
}
else
{
ret = dp[i][j-1] + dp[i + 1][j] - dp[i + 1][j - 1];
if (ret < 0)
ret += MOD;
ret %= MOD;
}
}
}
}
cout << "Case " << ++now << ": " << dp[0][len - 1] % MOD << endl;
}
}
1008 Hehe
组合数学吧,种类正好满足一个斐波那契数列的递推关系。
/****************************************************/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <stack>
#include <map>
#include <queue>
#include <algorithm>
#include <ctime>
#define EPS 1E-8
#define MAXN 10090
#define INF (~0U>>2)
#define MOD 10007
using namespace std;
typedef long long LL;
/****************************************************/
char str[MAXN];
int fab[5050];
int main()
{
int t, now = 0;
fab[1] = 1;
fab[2] = 2;
for (int i = 3; i <= 5050; i++)
{
fab[i] = fab[i - 2] + fab[i - 1];
fab[i] %= MOD;
}
scanf("%d", &t);
while (t--)
{
scanf("%s", str);
int len = strlen(str);
int flag = 0, cnt = 0, ans = 1;
for (int i = 0; i <= len; i++)
{
if (str[i] == 'h' && str[i + 1] == 'e' && flag == 0)
{
flag = 1;
cnt = 1;
i++;
}
else if (flag == 1 && str[i] == 'h' && str[i+1] == 'e')
{
//puts("ok");
cnt++;
i++;
}
else if (str[i] != 'h')
{
flag = 0;
//cout << cnt << endl;
if (cnt > 0)
{
ans *= fab[cnt];
//cout << ans << endl;
ans %= MOD;
}
cnt = 0;
}
}
printf("Case %d: %d\n", ++now, ans);
}
}
TODO