一、数字游戏——经典动态规划
2、问题分析
首先n个数在一个环上,要把这个环分成m部分,所以我们先要用一个数组来表示环,S[i]表示环(1=<i=<2*n),且有S[i]=S[n+i],用SUM[i]表示前i个数的和,则SUM[1]=S[1],SUM[i]=SUM[i-1]+S[i],其中不2<=i<2*n。MAXD[i][j]表示把前i个数分成j部分得到最大值的最优解,则我们可以得递推公式
MAXD[i][j]=max{MAXD[k][j-1]*(((SUM[i]-SUM[k])%10+10 )%10)}(j-1<=k
同理我们用MIND[i][j]表示把前i个数分成j部分得到最小值的最优解,递推公式为
MIND[i][j]=min{MIND[k][j-1]*(((SUM[i]-SUM[k])%10+10 )%10)}(j-1<=k
代码实现如下:
#include
#include
#include
using namespace std;
int s[101];
int sum[51];
int maxd[51][31];
int mind[51][31];
int solve_max(int n,int m)
{
int i,j,k,max,maxx;
for(i=1;i<=n;i++)
{
maxd[i][1]=(sum[i]%10+10)%10;
}
for(j=2;j<=m;j++)
for(i=j;i<=n;i++)
{
max=0;
for(k=j-1;k
{