题目:
分析:
相关的数学知识:
但是没有用到。
题解给的dp,按理说挺容易想到dp的,可能收到了数学公式的制约。思维被限制了。
代码:
#include<bits/stdc++.h>
using namespace std;
int A[60];
int f(int n)
{//可以不分的最大值
if(A[n]!=-1) return A[n];
A[n]=n;
for(int i=1;i<=n/2;i++)
{
A[n]=max(A[n],f(n-i)*f(i));
}
return A[n];
}
int main()
{
int n;
if(n==2) return 1;
int maxx=-1;
memset(A,-1,sizeof(A));
A[1]=1;
A[2]=2;
A[3]=3;
for(int i=1;i<=n/2;i++)
{
maxx=max(maxx,f(n-i)*i);
}
return maxx;
}
12.15再次做,依然没反应过来是dp,换了一种dp:
class Solution {
public:
int f(vector<vector<int> >& vv,int x,int y)
{
if(vv[x][y]!=-1) return vv[x][y];
if(y==1) return x;
if(x==y) return 1;
for(int i=1;x-i>=y-1;i++)
{
vv[x][y]=max(vv[x][y],i*f(vv,x-i,y-1));
}
return vv[x][y];
}
int cuttingRope(int n) {
vector<vector<int> > vv(n+1,vector<int>(n+1,-1));
//vv[i][j] 长度为i分成j段。
int maxx=-1;
for(int i=2;i<=n;i++)
{
maxx=max(maxx,f(vv,n,i));
}
return maxx;
}
};
题解的和我的第一次的一样,但消除了回溯。
dp【i】代表绳子长度i情况下的最大追。
dp【i】=dp【j】*(i-j)
不对,dp[i]代表的是必须至少分两次的最优值。
class Solution {
public:
int cuttingRope(int n) {
vector<int> v(n+1,1);
for(int i=2;i<=n;i++)
{
for(int j=1;j<i;j++)
{
v[i]=max(v[i],max((i-j)*j,v[j]*(i-j)));
}
}
return v[n];
}
};
这里写的非常的严谨,因为如果没有(i-j)j的话,v[j](i-j)相当于最少分3次了。
v[i]=max(v[i],max((i-j)*j,v[j]*(i-j)));