Shirlies
宁静专注认真的程序媛~
摘要: 就这样A了……我的思路大致是:获得生活费与花费的差(在纸上演练一下就清楚为什么了),这一题是求序列和要大于等于0的最长子序列,并且该序列的第一个值必须>=0,还有一个地方就是这是一个圆圈,即从第N个数可以回头转到第一个值,但是最多也就是转一圈,即将该序列浏览两遍,但是转到第一个值的条件是dp[n] > 0,因为只有最后一个dp值大于0的时候转到前面才有意义,试问,如果最后一个dp值小于等于0,都已经欠钱了,早就被踢出德国了……然后为了方便可以将dp[n]存在dp[0]里面……还有一个问题是浏览第一遍数组时,如果所得值已经大于n了,就没有必要继续了,给maxn直接赋值n就可以退出循环 阅读全文
posted @ 2012-08-16 22:19 Shirlies 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 如果从i->j有路的话,dp[j] = max(dp[j],dp[i]+value[j]),并记录下path[j],如果选择的是dp[i]+value[j],则path[j] = i;之后回溯就可以找到所有路径了……其实这一题可以用压缩版的数组(其实一维数组啦)存储是否有路径,可以节约一半的空间(因为一个地方只有到另外一个编号比它大的城市的路),为了方便我还是用的二维数组^_^代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 int dp[105]; 6 阅读全文
posted @ 2012-08-16 20:54 Shirlies 阅读(221) 评论(0) 推荐(0) 编辑