记忆化搜索 HDU 1158
效率很低,本来半个小时可以搞定的题目,结果花了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; }