牛牛
来源:互联网 发布:米思米2016选型软件 编辑:程序博客网 时间:2024/06/17 20:56
牛牛玩牌 Cow Solitaire
题目描述:用NxN张扑克牌排成一个方阵。每块牌的点阵形成一个NxN的整数网格A,从左下角A[N,1]漫游(每一步只能向上或者向右行走一步)到右上角A[N,N],要求漫游路径上各个格子中整数之和最大。这是一个组合优化问题。从网格左下角A[N,1]到右上角A[N,N]有很多路径,每条路径上2N-1个数之和为该条路径的目标值,目的是找到一条目标值最大的路径的目标值。
算法思路
这是我写的第一个动态规划的题目,之前看了一个知乎Live的关于算法的经验交流,live的时候大部分人都是很关心DP如何提高,感觉DP非常困难的样子,所以我一直不敢接触DP。这个学期刚好开始学习算法基础与分析了,我就慢慢接触DP,我个人感觉这个题目还是比较简单的,最优子结构也比较好找,有点像组合数学里面找递推关系,但是这个递推关系又有点不同,因为是取子结构中最优解。
该题目还是比较比较好看出递推关系,如果当前的牌大小为S[R][C]的话,递归的函数名称为int Cow_Solitaire的话,当前的最优解是前一个状态的最优解再加上当前卡牌的数字,即Cow_Solitaire[R][C]=max(Cow_Solitaire[R+1][C],Cow_Solitaire[R][C-1])+S[R][C]
这是最关键的最优子结构递推式,而且当行数到了N之后,再递归,其行数为N+1或者列数为0时需要返回,因为这两个坐标根本没有卡牌。
Matrix.cpp
#include "Matrix.hpp"void Matrix::twoDimensionStringArray(string **&card,int **&Maze){ card=new string* [row+1]; Maze=new int* [row+1]; for(int i=0;i<row+1;i++){ card[i]=new string [column+1]; Maze[i]=new int [column+1]; }}void Matrix::create_Matrix(string **&card,int **&Maze){ for(int i=0;i<=row;i++){ for(int j=0;j<=column;j++){ Maze[i][j]=0; if(j==0||i==row) card[i][j]="bc"; else cin>>card[i][j]; } }}void Matrix::display_Matrix(string **&card){ for(int i=0;i<=row;i++){ for(int j=0;j<=column;j++){ //if(j==0||i==row) cout<<card[i][j]<<" "; //else //cin>>card[i][j]; } cout<<endl; }}void Matrix::display_Maze(int **Maze){ for(int i=0;i<=row;i++){ for(int j=0;j<=column;j++){ //if(j==0||i==row) cout<<Maze[i][j]<<" "; //else //cin>>card[i][j]; } cout<<endl; }}int Matrix::card_Number(string s){ if(s[0]>='2'&&s[0]<='9') return s[0]-'0'; switch(s[0]){ case 'A': return 1; case 'T': return 10; case 'J': return 11; case 'Q': return 12; case 'K': return 13; }}int Matrix::cow_Solitaire(string **&card,int **&Maze,int R,int C){ int a,b; if(R==row||C==0) return 0; a=cow_Solitaire(card,Maze,R+1,C); b=cow_Solitaire(card,Maze,R,C-1); Maze[R][C]=1; return (a>b?a:b)+card_Number(card[R][C]);}
Matrix.hpp
#pragma once#include<string>#include <iostream>using namespace std;class Matrix{ public: Matrix(){ cin>>row>>column; } //Matrix(string **card); Matrix(int m,int n); void create_Matrix(string **&card,int **&Maze); void display_Matrix(string **&card); void display_Maze(int **Maze); int cow_Solitaire(string **&card,int **&Maze,int row,int column); int card_Number(string s); void twoDimensionStringArray(string **&card,int **&Maze); private: int row; int column;};
main.cpp
#include "Matrix.hpp"int main(){ int **Maze; string **card; Matrix matrix; matrix.twoDimensionStringArray(card,Maze); matrix.create_Matrix(card,Maze); cout<<matrix.cow_Solitaire(card,Maze,0,5)<<endl; matrix.display_Matrix(card); return 0;}
测试结果
Input Line
4
5
AA 2B 3C 4D 5D
5A 6B 7C 8D AA
9A TB JC QD AA
KA AB 2C 3D AA
Output Line
72
谢谢大家,希望对大家有帮助!
- 牛牛
- 牛牛
- A 牛牛
- 牛牛 斗地主
- 牛牛 棋牌游戏
- 完整的H5牛牛 教程分享 源码
- 一个朋友考雅思的经历——牛牛,太牛了!
- 人工智能界(AI)‘牛牛’主页&坐镇机器学习(machine learning)的江湖大家
- 网狐6603 麻将、房卡类子游戏《牛牛》(手机端+服务器+数据库)全套完整源码
- acm练习 零起点学算法78——牛牛 2017 02 24
- 3D联网捕鱼 牛牛 森林舞会 豪车 手游源码 首个3D联网捕鱼
- 最新微信H5牛牛liunx版五大神兽牛牛金花三公带胜率透视版搭建教程
- 1080游戏中心 www.1080game.com,摇钱树捕鱼,网络街机电玩,网络街机捕鱼,万炮捕鱼,棋牌游戏大厅,牛牛
- 使用KNN算法识别数字
- 定时从大数据平台同步HIVE数据到oracle
- 一次完整的 HTTP 请求过程
- mac安装mysql + sequel pro
- Mongo3.4.3版本 vue界面不显示collections
- 牛牛
- Java基础学习笔记:(五)String类
- React创建组件的三种方式
- POJ
- 位运算
- 方格分割(DFS搜索算法)
- 一次python爬虫爬取p站的经历
- ko绑定----记录
- centos6.5安装oracle11g