2015 Multi-University Training Contest 9(hdu 5396 - hdu 5405)
2015-08-27 10:27
591 查看
1.Expression
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5396解题思路:/article/1958530.html
AC代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long ll; const int MOD = 1e9+7; const int maxn = 100; ll c[maxn+5][maxn+5],f[maxn+5]; ll dp[maxn+5][maxn+5]; char op[maxn+5]; void init(){ for(int i = 0; i <= maxn; i++){ c[i][0] = c[i][i] = 1; for(int j = 1; j <= i; j++) c[i][j] = (c[i-1][j]+c[i-1][j-1])%MOD; } f[0] = 1; for(int i = 1; i <= maxn; i++) f[i] = f[i-1]*i%MOD; } int main () { init (); int n; while (~scanf("%d",&n)) { memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; i++) scanf("%d", &dp[i][i]); getchar(); gets(op); for (int i = n-1; i >= 0; i--) { for (int j = i + 1; j < n; j++) { int len = j - i - 1; for (int k = i; k < j; k++) { int l = k - i, r = j - k - 1; ll ret = 0; if (op[k] == '+') { ret = (ret + dp[i][k] * f[r]) % MOD; ret = (ret + dp[k+1][j] * f[l]) % MOD; } else if (op[k] == '-') { ret = (ret + dp[i][k] * f[r]) % MOD; ret = ((ret - dp[k+1][j] * f[l]) % MOD + MOD) % MOD; } else if (op[k] == '*') ret = dp[i][k] * dp[k+1][j] % MOD; dp[i][j] = (dp[i][j] + ret * c[len][l]) % MOD; } //printf("%d %d: %d\n", i, j, dp[i][j]); } } printf("%lld\n", dp[0][n-1]); } return 0; }
2.Hack it!
3.GCD Tree
4.Too Simple
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5399解题思路:/article/1958499.html
AC代码:
#include <iostream> #include <cstdio> #define MOD 1000000007 using namespace std; typedef long long ll; int n,m; ll f[105],a[105][105]; int main(){ f[0] = 1; for(int i = 1; i <= 100; i++) f[i] = f[i-1]*i%MOD; while(~scanf("%d%d",&n,&m)){ ll tot = 0,ans = 1; for(int i = 1; i <= m; i++){ scanf("%lld",&a[i][1]); if(a[i][1] == -1) tot++; else{ for(int j = 2; j <= n; j++){ scanf("%lld",&a[i][j]); for(int k = j-1; k >= 1; k--) if(a[i][j] == a[i][k]) ans = 0; } } } for(int i = 1; i < tot; i++) ans = ans*f %MOD; if(tot == 0){ for(int i = 1; i <= n; i++) a[0][i] = i; for(int i = m; i>= 1; i--) for(int j = 1; j <= n; j++) a[0][j] = a[i][a[0][j]];//映射转换 for(int i = 1; i <= n; i++) if(a[0][i] != i) ans = 0;//如果不能变回原来的数列,则为0 } printf("%lld\n",ans); } return 0; }
5.Arithmetic Sequence
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5400解题思路:/article/1958500.html
AC代码:
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; int a[100005]; ll l[100005],r[100005]; int main(){ int n,d1,d2; while(~scanf("%d%d%d",&n,&d1,&d2)){ for(int i = 1; i <= n; i++) scanf("%d",&a[i]); ll ans = 0; if(d1 == d2){ ll sum = 1; for(int i = 2; i <= n; i++){ if(a[i] == a[i-1]+d1) sum++; else{ ans += (sum+1)*sum/2; sum = 1; } } ans += (sum+1)*sum/2; } else{ l[0] = 0;r[n+1] = 0; for(int i = 1; i <= n; i++){ if(a[i] == a[i-1]+d1) l[i] = l[i-1]+1; else l[i] = 1; } for(int i = n; i >= 1; i--){ if(a[i] == a[i+1]-d2) r[i] = r[i+1]+1; else r[i] = 1; } for(int i = 1; i <= n; i++) ans += (l[i]*r[i]); } printf("%lld\n",ans); } return 0; }
6.Persistent Link/cut Tree
7.Travelling Salesman Problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402解题思路:/article/1958531.html
AC代码:
#include <iostream> #include <cstdio> using namespace std; const int N = 105; int s ; int main(){ int n,m,sum,x,y; while(~scanf("%d%d",&n,&m)){ sum = 0;x = 1;y = 2; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { scanf("%d",&s[i][j]); sum += s[i][j]; if(((i+j)&1) && s[x][y]>s[i][j]) x = i,y = j; } if(n&1 || m&1) { printf("%d\n",sum); if(n&1) { for(int i = 1; i <= n; i++) { for(int j = 1; j < m; j++) if(i&1) printf("R"); else printf("L"); if(i < n) printf("D"); else printf("\n"); } } else { for(int i = 1; i <= m; i++) { for(int j = 1; j < n; j++) if(i&1) printf("D"); else printf("U"); if(i<m) printf("R"); else printf("\n"); } } } else { printf("%d\n",sum-s[x][y]); for(int i = 1; i <= n; i+=2) { if(x==i || x==i+1) { for(int j = 1; j < y; j++) { if(j&1) printf("D"); else printf("U"); printf("R"); } if(y < m) printf("R"); for(int j = y+1; j <= m; j++) { if(j&1) printf("U"); else printf("D"); if(j < m) printf("R"); } if(i < n-1) printf("D"); } else if(x < i) { for(int j = 1; j < m; j++) printf("L"); printf("D"); for(int j = 1; j < m; j++) printf("R"); if(i < n-1) printf("D"); } else { for(int j = 1; j < m; j++) printf("R"); printf("D"); for(int j = 1; j < m; j++) printf("L"); printf("D"); } } printf("\n"); } } return 0; }
8.Goldbach's Conjecture
9.Random Inversion Machine
10.Sometimes Naive
相关文章推荐
- AIDL的简单示例与解析
- hdoj 1023 Train Problem II 【卡特兰数】
- RAID各级别的特性
- MainActivity 嵌入 Fragment 的每个函数执行的生命周期
- hdoj.1023 Train Problem II【卡特兰数列】 2015/08/27
- 2015.6.17(Tair)
- oc assign / copy / retain / 容器 / 多态
- oc MRC内存管理机制alloc/retain/copy/release/autorelease
- Syntax error, type annotations are available only when source level is at least 1.8
- install ftp client on kail
- Container With Most Water
- LightOJ 1403 - Air Raid【二分匹配】
- Leetcode: Contains Duplicate
- Leetcode: Factorial Trailing Zeroes
- ideaiu的使用
- CCComponentContainer,CCComponent解析
- 安装APK:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
- 异常:org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection available
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 1) B. Minimization 贪心 dp
- LeetCode题解:Factorial Trailing Zeroes