1.二维数组的动态规划
二维数组的动态规划可以由奥数里面的下标法
就是如下图:
题目:杨辉三角:
思路:
这个二维数组,用奥数下标法画出图如下:
1.公式:dp[i][j]=dp[i-1][j]+dp[i][j-1];
2.边界处理:开头和结尾都是1;if(j1||ji) dp[i][j]=1;
3.最开始的初始化:dp[1][1]=1;
代码:
#include <iostream>
using namespace std;
int dp[10010][10010];
int main()
{
int n;
cin>>n;
dp[1][1]=1;//开头初始化为1;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=i;++j)
{
if(j==1||j==i) dp[i][j]=1;//边界处理,如果是开头和结尾的话就是1;
else dp[i][j]=dp[i-1][j]+dp[i-1][j-1];//每个数组都是上一行的加上上一行前面一个;
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=i;++j)
{
cout<<dp[i][j]<<' ';
}
cout<<endl;
}
}
题目:路径计数2
思路:
1.公式:dp[i][j]+=dp[i-1][j]+dp[i][j-1];//每个地方可以由上一行和前一个数字转移过来,每个位置=上一行的位置+前一个位置;
2.边界处理:如果是第一行 dp[i][j]=(dp[i][j]+dp[i][j-1])%100003;
如果是第一列,只能从上一行下来:f[i][j]=(f[i][j]+f[i-1][j])%100003;
3.初始化:
dp[1][1]=1;
代码:
#include<cstdio>
#include <iostream>
using namespace std;
int f[1010