1112

来源:互联网 发布:长征六号 知乎 编辑:程序博客网 时间:2024/05/29 05:10

Time Limit: 1 Sec Memory Limit: 128 MB


有M只走地鸡,编号1到M;有N个鸡笼,编号1到N,且N>=M。先安排这些走地鸡入笼,要求如下:

  1. 每只鸡单独入一个笼;

  2. 对于任意两只走地鸡A和B,如果A的编号>B的编号,那么要求A住的笼子编号>B住的笼子编号

每只走地鸡的居住偏好不一样,住在不同的笼子里面产生的舒适感不一样。用Aij表示编号i的鸡住在编号j的笼子里的舒适系数(越大代表越舒适)。为了让这些走地鸡将来能卖个好价钱,需要尽可能提高他们的居住舒适系数。现在要求你编写程序,安排走地鸡入笼,求所有走地鸡可能达到的最大舒适系数之和。

Input

第一行输入测试用例个数T,接下来T个测试用例:

每个测试用例首行行包含两个数: M, N。(1<=M<=100, M<=N<=100 )

接下来的M行:每行N个数,代表Aij矩阵。 (-50<=Aij<=50,Aij为编号i的鸡住在编号j的笼子里的舒适系数)

Output

输出T行,分别代表T个测试用例的最大舒适系数之和(每行以“#测试用例编号”开头,然后空一格输出结果)

Sample Input

    1    3 5    7 23 -5 -24 16    5 21 -4 10 23    -21 5 -4 -20 20    Sample Output     #1 53

code:

    #include<stdio.h>    #include<iostream>    using namespace std;    #define DEBUG 1    const int MAX_SIZE = 105;    int a[MAX_SIZE][MAX_SIZE];    int dp[MAX_SIZE][MAX_SIZE];    int M,N;    int i,j,k,t;    void main_function();    void my_dp();    int main(){        int T;        cin>>T;        for(t = 1; t <= T; t++)        {            cin>>M>>N;            for(i = 0; i < M; i++)            {                for(j = 0; j < N; j++)                {                    cin>>a[i][j];                }            }            dp[0][0] = a[0][0];            for(j = 1; j < N; j++)            {                if(a[0][j] > dp[0][j - 1])                {                    dp[0][j] = a[0][j];                }                else                {                    dp[0][j] = dp[0][j-1];                }            }    #if DEBUG            my_dp();    #else            main_function();    #endif            printf("#%d %d\n", t, dp[M-1][N-1]);        }        return 0;    }    //定义i只鸡,j个笼的最优解是dp[i][j], i <= j    //i = 0时, 直接初始化,相当于找最大数    //i = 1时, 若不放到最后一格,则直接等于dp[i][j-1],若放最后一格,则等于dp[i-1][j-1] + a[i][j]    void my_dp()    {        for(i = 1; i < M; i++)        {            for(j = i; j < N; j++)            {                //for(k = i - 1; k < j; k++)这里其实是重复计算了,没必要这么算。直接复用上一个计算结果就可以了                {                    dp[i][j] = dp[i - 1][j - 1] + a[i][j];                    if(i < j && dp[i][j] < dp[i][j-1])                    {                        dp[i][j] = dp[i][j-1];                    }                }            }        }    }    //这题定义状态j个笼,i只鸡的最优解是dp[i][j],其中j要大于等于i    //转移方程i = 0的时候,直接初始化,相当于找最大数    //i =1的时候,若不放到最后一格,则直接等于dp[1][0],若放最后一格,则等于dp[0][0] + a[1][1]    void main_function()    {        for(j = 1; j < N; j++)        {            for(i = 1; i <= j; i++)            {                dp[i][j] = dp[i - 1][j - 1] + a[i][j];                if(i < j && dp[i][j-1] > dp[i][j])                {                    dp[i][j] = dp[i][j - 1];                }            }        }    }    /**************************************************************        Problem: 1112        User: seaicelin        Language: C++        Result: Accepted        Time:120 ms        Memory:1768 kb    ****************************************************************/

output:

13 57 23 -5 -24 165 21 -4 10 23-21 5 -4 -20 207 23 23 23 230 28 28 33 460 0 24 24 53#1 53请按任意键继续. .
0 0
原创粉丝点击