codeforces div2 round#230 D
来源:互联网 发布:网络照片素材 编辑:程序博客网 时间:2024/05/01 04:12
算是经典模型和比较简单的一道dp吧,比赛完之后看到题目我这种dp渣都有点感动。
我们用dp[i][j][k]来表示将i个盘子从j号柱子移到k号柱子的最小花费,那么最终我们所求的就是dp[n][1][3]。
状态转移方程也比较好想,dp[n][a][c]=min(dp[n-1][a][b]+cost[a][c]+dp[n-1][b][c],dp[n-1][a][c]+cost[a][b]+dp[n-1][c][a]+cost[b][c]+dp[n-1][a][c])。
对dp的理解不是很在行,所以dp还是习惯拿记忆化搜索写。
#include "cstdio"#include "cstring"#include "algorithm"#define LL long longusing namespace std;LL cost[4][4];LL dp[50][4][4];LL dfs(int n,int a,int c){ if(n==0) return dp[n][a][c]=0; if(dp[n][a][c]!=-1) return dp[n][a][c]; LL ans,tmp; int b=6-a-c; ans=dfs(n-1,a,b)+cost[a][c]+dfs(n-1,b,c); tmp=2*dfs(n-1,a,c)+cost[a][b]+dfs(n-1,c,a)+cost[b][c]; ans=min(ans,tmp); return dp[n][a][c]=ans;}int main(){ int n; for(int i=1;i<4;i++) for(int j=1;j<4;j++) scanf("%lld",&cost[i][j]); scanf("%d",&n); for(int i=0;i<=n;i++) for(int j=1;j<4;j++) for(int k=1;k<4;k++) dp[i][j][k]=-1; printf("%lld\n",dfs(n,1,3)); return 0;}
0 0
- CodeForces Round 230 Div2 D
- codeforces div2 round#230 D
- Codeforces Round #317div2 D
- codeforces round#377 div2 D
- codeforces Round #382(Div2) D
- Codeforces Round #409 div2 D
- Codeforces #Round 447Div2 D
- Codeforces Round#450 div2 D
- codeforces Round #237(div2) D解题报告
- codeforces Round #238(div2) d解题报告
- codeforces Round #241(div2) D解题报告
- codeforces round #257 div2 C、D
- codeforces Round #269(div2) D解题报告
- D. Flowers Codeforces Round #271(div2)
- codeforces Round #271(div2) D解题报告
- codeforces Round #272(div2) D解题报告
- codeforces Round #264(div2) D解题报告
- codeforces Round #263(div2) D解题报告
- dfs
- 文件操作(OJ数据生成)
- 贪心 删数问题
- HDU 1016 Prime Ring Problem(经典DFS )
- linux进程与线程的区别
- codeforces div2 round#230 D
- iOS安全攻防(十九):基于脚本实现动态库注入
- 这辈子
- 眺望
- pn结工作原理
- 你是我心里,最痴心的馨香百合!
- 西工大:那些人儿、那些事儿
- Install cf v6
- amr-linux-gcc