本题选自洛谷训练场。。。传送门,点击!
First.
对于这种多过程问题,需要将其分解并进行分析。(废话)
Second.
说点实际的,关于解题思路:
- 在每一组城堡高度中,需将所有的可能组合计算出来,这是便需要运用01背包的思路;
- 但是,又以样例数据可以看出得到的数组中会有重复的部分;
- 运用set去重!(
超机智!) - 但是要注意清空dp数组与set,不然会很鬼畜。。。。
- 运用一个数组,来存储出现个数,再倒序寻找(
技巧性极高)
Third.
上代码!
#include <iostream> #include <cstring> #include <set> using namespace std; int n; set<int> st; int len[110]; int sum[110]; int dp[11000]; int cnt[10010]; int hi[110][110]; int main() { cin>>n; for(int i=1;i<=n;i++) { len[i]=1; while(cin>>hi[i][len[i]]) { if(hi[i][len[i]]==-1) break; else sum[i]+=hi[i][len[i]++]; } } for(int k=1;k<=n;k++) { for(int i=0;i<len[k];i++) for(int j=sum[k];j>=hi[k][i];j--) dp[j]=max(dp[j],dp[j-hi[k][i]]+hi[k][i]); for(int i=0;i<=sum[k];i++) { if(!st.count(dp[i])) { cnt[dp[i]]++; st.insert(dp[i]); } } st.clear(); memset(dp,0,sizeof(dp)); } for(int i=10000;i>=0;i--) if(cnt[i]==n) { cout<<i<<endl; return 0; } }
讯享网
Fourth.
有意见请于评论中提出,一同进步。。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/61622.html