计数型动态规划

计数型动态规划

计数型动态规划_第1张图片
第一步确定状态:

这个地方要用一个叫做加法原理的东西:比如说:从武汉到上海有乘火车、飞机、轮船3种交通方式可供选择,而火车、飞机、轮船分别有k1,k2,k3个班次,那么从武汉到上海共有 k1+k2+k3种方式可以到达。

这里一样要到达a[i][j]这个位置那么到达这个位置的方式就等于a[i-1][j]+a[i][j-1]

那么状态又是怎么变小的呢(规模变小),我们a[i-1][j]比a[i][j]是不是就少了一行,规模就缩小了,那么我们如何来确定开多大维度的数组:有几个变量就开几个数组

那么状态就是:设a[i][j]为机器人有多少总方式从左上角走到(i,j)

第二步转移方程:

其实分析的时候转移方程已经出来了:
a[i][j]=a[i-1][j]+a[i][j-1]

第三步初始条件和边界情况:

初始条件:很明显在a[0][0]的情况下为1,因为只有一种方式走到自己的原点,注意哦不是0.

边界情况:i=0或者j=0的时候,都只有一直往下或者一直向右走,那么这个时候f[i][j]=1;

第四步计算顺序:

从原点开始

题解:

#include 
using namespace std;
int main()
{
	int m,n;
	cin>>m>>n;
	int a[m][n];
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
		    if(i==0||j==0)
			a[i][j]=1;
			else if(i==0&&j==0)
			a[i][j]=0;
			else 
			a[i][j]=a[i-1][j]+a[i][j-1];
		}	
	}
	cout<<a[m-1][n-1]; 	 
 } 

你可能感兴趣的:(动态规划,算法)