ZOJ-1524

来源:互联网 发布:ubuntu16 更换软件源 编辑:程序博客网 时间:2024/06/16 21:20

又是DP,没有想像那么简单。。开始天真地直接硬搞,连sample的数据都过不了。。后来改了改算法,把最优解的最大商品下标保存下来,下次取的商品不能和前面最优结构最大下标相同,简单数据可以过,但是真实数据非常大,有几组数据这样是过不了。。算法有问题,后来仔细研究了一组数据,发现了存在的问题,尝试反向遍历DP,竟然过了。。原理的理解不是很透彻,多刷些DP加深理解吧。。网上搜了搜其他人的代码,感觉自己的应该是最简洁的了,时间和空间都不大,小得瑟一下

#include<stdio.h>#include<limits.h>int main(){int m, n, a[101];double dp[101];while (scanf("%d %d", &m, &n), m || n){int i, j, k;double p;for (i = 1; i <= m; i++){scanf("%d", &a[i]);dp[i] = INT_MAX;}dp[0] = 0;for (j = 1; j <= n; j++){scanf("%d %lf", &k, &p);//注意一定要从反向遍历,正向遍历就WAfor (i = m; i > 0; i--)if (a[i] == k && dp[i - 1] != INT_MAX && dp[i - 1] + p < dp[i])dp[i] = dp[i - 1] + p;}if (dp[m] != INT_MAX)printf("%.2lf\n", dp[m]);elseputs("Impossible");}return 0;}


0 0
原创粉丝点击