codevs 1068 乌龟棋(记忆化搜索)
2017-05-12 17:36
260 查看
题意:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/31/1e8c3426ae6651f05533a19b974f90d1)
思路:
记忆化搜索或者递推
记忆化搜索代码:
递推代码:
思路:
记忆化搜索或者递推
记忆化搜索代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 55; int dp[maxn][maxn][maxn][maxn]; int n, m, a[505]; int cnt1, cnt2, cnt3, cnt4; int dfs(int c1, int c2, int c3, int c4) { if(!(c1+c2+c3+c4)) return a[1]; if(dp[c1][c2][c3][c4]) return dp[c1][c2][c3][c4]; if(c1) dp[c1][c2][c3][c4] = max(dp[c1][c2][c3][c4], dfs(c1-1, c2, c3, c4)+a[c1*1+c2*2+c3*3+c4*4+1]); if(c2) dp[c1][c2][c3][c4] = max(dp[c1][c2][c3][c4], dfs(c1, c2-1, c3, c4)+a[c1*1+c2*2+c3*3+c4*4+1]); if(c3) dp[c1][c2][c3][c4] = max(dp[c1][c2][c3][c4], dfs(c1, c2, c3-1, c4)+a[c1*1+c2*2+c3*3+c4*4+1]); if(c4) dp[c1][c2][c3][c4] = max(dp[c1][c2][c3][c4], dfs(c1, c2, c3, c4-1)+a[c1*1+c2*2+c3*3+c4*4+1]); return dp[c1][c2][c3][c4]; } int main(void) { while(cin >> n >> m) { memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); cnt1 = cnt2 = cnt3 = cnt4 = 0; for(int i = 1; i <= m; i++) { int t; scanf("%d", &t); if(t == 1) cnt1++; if(t == 2) cnt2++; if(t == 3) cnt3++; if(t == 4) cnt4++; } printf("%d\n", dfs(cnt1, cnt2, cnt3, cnt4)); } return 0; }
递推代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<set> #include<cmath> using namespace std; typedef long long ll; const ll maxn = 505; int dp[55][55][55][55]; int a[maxn]; int main(void) { int n, m; while(cin >> n >> m) { for(int i = 1; i <= n; i++) scanf("%d", &a[i]); int cnt1, cnt2, cnt3, cnt4; cnt1 = cnt2 = cnt3 = cnt4 = 0; for(int i = 1; i <= m; i++) { int t; scanf("%d", &t); if(t == 1) cnt1++; if(t == 2) cnt2++; if(t == 3) cnt3++; if(t == 4) cnt4++; } dp[0][0][0][0] = a[1]; for(int i = 0; i <= cnt1; i++) for(int j = 0; j <= cnt2; j++) for(int k = 0; k <= cnt3; k++) for(int l = 0; l <= cnt4; l++) { int val = a[1+i+j*2+k*3+l*4]; if(i) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i-1][j][k][l]+val); if(j) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j-1][k][l]+val); if(k) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k-1][l]+val); if(l) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k][l-1]+val); } printf("%d\n", dp[cnt1][cnt2][cnt3][cnt4]); } return 0; }
相关文章推荐
- codevs 1068 乌龟棋
- code[vs] 1068乌龟棋(四维dp)
- codevs 1068 乌龟棋(动态规划)
- 乌龟棋 (codevs 1068)题解
- 乌龟棋_CODEVS1068_DP
- codevs1068乌龟棋
- CODE[VS] 1068 乌龟棋
- CODE[VS] 1068 乌龟棋
- codevs1068乌龟棋-四维DP,五维如何缩减一维
- codevs1068 乌龟棋
- codevs1068 乌龟棋==洛谷P1541 乌龟棋
- 乌龟棋 【多维DP】 Codevs1068
- 【codevs1068】乌龟棋noip10年TG----第二个A掉的钻石题
- CODEVS 1068 乌龟棋
- CODEVS 1068乌龟棋
- Codevs 1068 乌龟棋
- CODEVS 1068 乌龟棋(背包型DP)
- 【基础练习】【背包DP】codevs1068 乌龟棋题解
- CODE[VS] 1068 乌龟棋
- codevs 1068 乌龟棋