标签:mes define max 动态规划 += names control bit 注意
1.plates
做题一定要改变量,并且先自己做,不然绝对理解不了题意。一定要换变量描述,不然就是照抄,没一点区别。昨晚把我熬死了快。感觉没毛病,一直报错
这是一个动态规划的题
分三个存储vector
第一个存所有输入值,第二个存sum,第三个存dp值
特别之处:存sum的第一位空0,没当找第k个这种问题,就要考虑,我实际下标是找k还是k-1呢。若欲找k,需挪下标,否则算k,需减下标,脑子要清楚!!!
这个就难为在这句话了min(j,n)才对,写成k这个min毫无意义,还会出现下面的情况。因为这个sum含义是在第i-1个取p个,所以必须是比列数小,因为要真实存在!!
for(int p=0;p<=min(j,k);++p)
store[i][j]=max(store[i][j],store[i-1][j-p]+sum[i-1][p]);
改好之后!!
input:
2
4 1 3
10
10
100
30
3 2 3
80 80
15 50
20 10
注意输入测试的多样性,横着来,竖着也来
#include<bits/stdc++.h> #define TEST using namespace std; //dp[i][j] first i plates sum is j //12 23 250 //70 9 1 find large 4 int main() { #ifdef TEST freopen("a.out","r",stdin); #endif int T; cin>>T; for(int o=1;o<=T;++o) { int m,n,k,ans=0; cin>>m>>n>>k; // cout<<m<<n<<k<<endl; vector<vector<int>> stone(m,vector<int>(n,0)); vector<vector<int>> sum(m,vector<int>(n+1,0));; vector<vector<int>> store(m+1,vector<int>(k+1,0)); for(int i=0;i<m;++i) { for(int j=0;j<n;++j) { cin>>stone[i][j]; } } for(int i=0;i<m;++i) { for(int j=1;j<=n;++j) { sum[i][j]=(sum[i][j-1]+stone[i][j-1]); } } for(int i=0;i<m;++i) { for(int j=0;j<=n;++j) { cout<<sum[i][j]<<" "; } cout<<endl; } // sum=stone; //build stone store //build dp array int l=min(k,n); // for(int c=1;c<=l;++c) // { // for(int g=0;g<m;++g) // store[g][c]=stone[g][c-1]; // } //// store[0]=stone[0]; // for(int j=1;j<=l;++j) // { // for(int g=0;g<m;++g) // store[g][j]+=store[g][j-1]; // } for(int i=1;i<=m;++i) { for(int j=1;j<=k;++j) { for(int p=0;p<=min(j,n);++p) store[i][j]=max(store[i][j],store[i-1][j-p]+sum[i-1][p]); } } for(int i=0;i<=m;++i) { for(int j=0;j<=k;++j) { cout<<store[i][j]<<" "; } cout<<endl; } cout<<"Case #"<<o<<": "<<store[m][k]<<endl; } return 0; }
标签:mes define max 动态规划 += names control bit 注意
原文地址:https://www.cnblogs.com/Marigolci/p/12806494.html