leetcode62.不同路径(最经典求方案数)
class Solution {
public:
int uniquePaths(int m, int n) {
int f[110][110] = {0};
f[0][0] = 1;
for(int i = 0 ; i< m;i++)
{
for(int j = 0; j <n; j++)
{
if( i > 0 && j > 0) //求方案数就是相加,求最大或者最小就是max/min(f[i-1][j],f[i][j-1])
f[i][j] = f[i-1][j] + f[i][j-1];
else if( i == 0 && j ==0) //起始位置0则跳过不处理
continue;
else if (i == 0) //如果当前处于第一行的时候,上一步只能从前一列过来
f[i][j] = f[i][j-1];
else if (j ==0) //如果当前处于第一列的时候,上一步只能从前一行过来
f[i][j]= f[i-1][j];
}
}
return f[m-1][n-1];
}
};
2067.走方格
上一个题目中加入了限制,行号和列数都是偶数的格子不能走
#include<iostream>
using namespace std;
#define N 35
int f[N][N];
int main()
{
int n,m;
cin >> n >> m;
f[1][1] = 1;
for(int i = 1; i <= n ;i++)
{
for(int j = 1; j <=m;j++)
{
if( (i % 2) ==0 && (j%2)==0 ) //如果是偶行偶列则跳过
continue;
else if ( i == 1 && j == 1)
continue;
else if( i ==1 )
f[i][j] = f[i][j-1];
else if (j==1)
f[i][j] = f[i-1][j];
else
f[i][j] = f[i-1][j] + f[i][j-1];
}
}
cout << f[n][m];
return 0;
}
不同路径感觉你写复杂了
我写的都是方便理解的,不知道你有什么好的思路
emmm,虽然说你的想法很不错,但是dp肯定是往简单的方向去解决问题,你可以看看leetcode上他们的题解,这些特判可以避免的(虽然有时候也是要特判)