码迷,mamicode.com
首页 > 其他好文 > 详细

打kickstart RoundA题目

时间:2020-04-30 09:16:16      阅读:49      评论:0      收藏:0      [点我收藏+]

标签: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;
}

 

打kickstart RoundA题目

标签:mes   define   max   动态规划   +=   names   control   bit   注意   

原文地址:https://www.cnblogs.com/Marigolci/p/12806494.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!