HDU 4632 Palindrome subsequence
又是一道回文的题目,求出不同的回文子序列的个数,大家比赛一直没做出来,虽然知道是区间DP
用dp[i][j]表示这一段里有多少个回文串,那首先dp[i][j]=dp[i+1][j]+dp[i][j-1],但是dp[i+1][j]和dp[i][j-1]可能有公共部分,所以要减去dp[i+1][j-1]。
如果str[i]==str[j]的话,还要加上dp[i+1][j-1]+1
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <vector> #include <set> #include <queue> #include <stack> #include <climits>//形如INT_MAX一类的 #define MAX 1111 #define mod 10007 #define INF 0x7FFFFFFF #define REP(i,s,t) for(int i=(s);i<=(t);++i) #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) #define mp(a,b) make_pair(a,b) #define L(x) x<<1 #define R(x) x<<1|1 # define eps 1e-5 //#pragma comment(linker, "/STACK:36777216") ///传说中的外挂 using namespace std; char str[MAX]; int dp[MAX][MAX]; int len; void init() { memset(dp,0,sizeof(dp)); for(int i=0; i<len; i++) dp[i][i]=1; } void solve() { for(int i=0; i<len; i++) for(int j=i-1; j>=0; j--) { dp[j][i] = (dp[j][i-1] + dp[j+1][i] - dp[j+1][i-1] + mod) % mod; if(str[i] == str[j]) dp[j][i] = (dp[j][i] + dp[j+1][i-1] + 1 + mod) % mod; } } int main() { int t; int ca = 1; scanf("%d",&t); while(t--) { scanf("%s",str); len = strlen(str); init(); solve(); printf("Case %d: %d\n",ca++,dp[0][len-1]); } return 0; }
HDU 4638 Group
http://blog.csdn.net/watermuch/article/details/9708755
HDU 4639 Hehe
题意:一个字符串的含义,由于有“hehe”在,所以呵呵可以被“wqnblgb”取代。 签到题......但是推了很久
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <string> #include <vector> #include <queue> #include <map> using namespace std; int ans; int h,h2,counter,l; char str[12000]; __int64 sum[6000]; void cal() { sum[1] = 1; sum[2] = 2; for(int i = 3; i<6000; i++) { sum[i] = (sum[i-1] + sum[i-2])%10007; //cout << sum[i] << endl; } } int main() { cal(); int T; cin >> T; int casee = 1; while(T --) { scanf("%s",str); int len = strlen(str); __int64 ans = 1; for(int i=0; i<len; i++) { if(str[i] == 'h' && str[i+1] == 'e') { int t = 1; int j = i + 2; while(str[j] == 'h' && str[j+1] == 'e' && j+1 < len ) { t ++; j += 2; } ans = ans * sum[t] % 10007; i = j; } } printf("Case %d: ",casee++); printf("%I64d\n",ans); } return 0; }
HDU 4642 Fliping game
博弈题,亮神瞬间推出,只要考虑右下角的点,为0就是bob,为1就是alice.............只能膜拜了
#include <cstdio> #include <iostream> #include <cmath> using namespace std; int a[111][111]; int n,m; int main() { int T; cin >> T; while(T --) { cin >> n >> m; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { cin >> a[i][j]; } } if(a[n-1][m-1] == 0) { printf("Bob\n"); continue; } else { printf("Alice\n"); continue; } } return 0; }