效率很低,本来半个小时可以搞定的题目,结果花了2个多小时
DP不会,继续记忆化搜索,虽然效率和递推的DP差了8倍,但是思路应该不会差距太大吧?
#include<stdio.h>
#include<string.h>
int visited[12][100005];
int month,hire,fire,salary,need[13];
int dfs(int ,int );
int main()
{
int i,lowest;
while(scanf("%d",&month)&&month)
{
memset(visited,-1,sizeof(visited));
scanf("%d %d %d",&hire,&salary,&fire);
for(i=0;i<month;i++)
scanf("%d",&need[i]);
lowest=need[0]*(salary+hire)+dfs(1,need[0]);
printf("%d\n",lowest);
}
return 0;
}
int dfs(int now,int num)
{
int i,k1,k,k3,max;
if(now==month)
return 0;
k1=k=k3=max=0x7fffffff;
if(visited[now][num]!=-1)
{
/* printf("visited!!!\n");*/
return visited[now][num];
}
if(need[now]>=num)
k1=hire*(need[now]-num)+salary*need[now]+dfs(now+1,need[now]);
else
{
for(i=0;i<=num-need[now];i++)
{
/* printf("fire!\n");*/
k=(num-i)*salary+i*fire+dfs(now+1,num-i);
if(k<k3) k3=k;
}
}
max=k1<k3?k1:k3;
visited[now][num]=max;
/* printf("NOW:%d nun:%d max:%d\n",now,num,max );*/
return max;
}