问题
https://vjudge.net/problem/UVA-10970
分析
递推
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=301;
int m,n,dp[maxn][maxn];
int main(void){
for(int i=2;i<maxn;++i) dp[i][1]=i-1;
for(int j=2;j<maxn;++j) dp[1][j]=j-1;
for(int i=2;i<maxn;++i){
for(int j=2;j<maxn;++j){
if(i>=j) dp[i][j]=dp[i][j-1]+dp[i][1]+1;
else dp[i][j]=dp[i-1][j]+dp[1][j]+1;
}
}
while(scanf("%d%d",&m,&n)==2){
printf("%d\n",dp[m][n]);
}
return 0;
}
看到了一个简单的做法:https://blog.csdn.net/hyczms/article/details/37882859
思想是:最初是一块,最后是mn块,每切一刀多出一块,1->2,2->3,3->4,不可一次多两块,所以一定切了mn-1刀