我正在进行一些编程竞赛..............我已经解决了与动态编程相关的一个问题。下面是问题的链接
我已经按照以下方式解决了问题 - :
#include<stdio.h>
short int moves[10000000];
int minimum(int a ,int b, int c)
{
if(a<b)
if(a<c)
return a;
else
return c;
else
if(b<c)
return b;
else
return c;
}
int FindMoves(int strength)
{
int m1=0,m2=0,m3=0;
int isBy2=0,isBy3=0;
if(strength==1)
{
moves[1]=0;
return 0;
}
else if(strength==2)
{
moves[2]=1;
return 1;
}
else if(strength==3)
{
moves[3]=1;
return 1;
}
else if(strength==4)
{
moves[4]=2;
return 2;
}
else if(strength==5)
{
moves[5]=3;
return 3;
}
else
{
if(moves[strength-1]!=-1)
{
m1=moves[strength-1];
}
else
{
m1=FindMoves(strength-1)+1;
moves[strength-1]=m1;
}
if(strength%2==0)
{
isBy2=1;
if(moves[strength/2]!=-1)
{
m2=moves[strength/2];
}
else
{
m2=FindMoves(strength/2)+1;
moves[strength/2]=m2;
}
}
if(strength%3==0)
{
isBy3=1;
if(moves[strength/3]!=-1)
{
m3=moves[strength/3];
}
else
{
m3=FindMoves(strength/3)+1;
moves[strength/3]=m3;
}
}
if(isBy2 && isBy3)
{
return minimum(m1,m2,m3);
}
else if(isBy3)
{
if(m1<m3)
return m1;
else
return m3;
}
else if(isBy2)
{
if(m1<m2)
return m1;
else
return m2;
}
else
{
return m1;
}
}
}
int main()
{
int i,t;
int result;
unsigned long int a[1000];
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<1000000;i++)
{
moves[i]=-1;
}
for(i=0;i<t;i++)
{
result = FindMoves(a[i]);
printf("%d\n",result);
}
return 0;
}
在上面的解决方案中,我采用了数组move []。这个数组将保留子问题的结果。在FindMove函数中,如果问题的大小很小,它会将该子问题的结果存储在maves中数组和返回。
如果子问题的大小很大,那么我已经调用了函数FindMoves()三次(一个用于强度-1,第二个用于强度/ 2如果可以被2整除,第三个用强度/ 3可以被3整除)和最后从三个中取出最少。
当问题的大小在数组大小(1-10 ^ 6)中时,上面的解决方案正常工作,但由于我的数组大小为10 ^ 6,因此不适用于大小超过10 ^ 6。
当输入的大小太大时,上面的解决方案不起作用(问题强度在1到10 ^ 9之间)但是我的数组大小比那个小。(我不能拿更多因为如果我需要更多我收到内存超出错误)
如果你没有遇到我的问题,可以在这里找到同样的问题。
http://www.codechef.com/wiki/tutorial-dynamic-programming
我的问题只是我正在使用动态编程(带递归),当问题的大小太大时,我的解决方案无效,因为我的数组大小不是太大
请建议我做什么...... 任何帮助将不胜感激.......
答案 0 :(得分:2)
最好不要使用移动[10000000]而是使用地图。您不需要覆盖1到10 ^ 9的所有整数,而只需使用
/ 2或(-1&amp; then / 2)以适用者为准
和(/ 3)或(-1&amp; then / 3)或(-1,-1&amp; then / 3)无论哪种情况适用,您都可以快速获得(t =)1000个测试用例的解决方案