POJ 1352(Quantity of White Mice)

题目链接地址:http://poj.org/problem?id=1352

这是一次数学建模作业题,老师说有难度,我一看AC的人也很少,也就越觉得很难,但实际做了才发现原来很简单呀······

关键还是要找到一个合适的状态和递推公式,在数学上也就叫做建模吧···

思路:定义mice[i][j]表示第i个月白鼠寿命为j的白鼠的个数,
        sur_num表示从上月活下来的白鼠,born_num表示本月刚刚出生的白鼠
        则:
        born_num = 0(出生的都转移到别的实验室了), (sur_num > 100)
        born_num = mice[i-1][6]+mice[i-1][7]+2*mice[i-1][7+j]   1 <= j <= m
        (0 < sur_num <= 100 )
  
        mice[i][1] = born_num
        mice[i][j] = mice[i-1][j-1]  2 <= j <= n

#include<iostream>
using namespace std;
#define maxn 40
int n,m,k,sur_num,born_num;
int mice[maxn][maxn];
char s[20];
void Init()
{
    memset(mice,0,sizeof(mice));
    for(int i = 0; i <= 6; i++)
        mice[i][i] = 1;
}
void change()
{
    int i,t;
    n = m = k = 0;
    t = 1,i = strlen(s)-1;
    while(s[i] != ',')
    {
        k += t * (s[i]-'0');
        t *= 10;
        i--;
    }
    t = 1,i--;
    while(s[i] != ',')
    {
        m += t * (s[i]-'0');
        t *= 10;
        i--;
    }
    t = 1,i--;
    while(s[i] != ',' && i >= 0)
    {
        n += t * (s[i]-'0');
        t *= 10;
        i--;
    }
}
void solve()
{
    int i,j;
    for(i = 7; i <= k; i++)
    {
        sur_num = born_num = 0;
        for(j = 1; j <= n-1; j++)
            sur_num += mice[i-1][j];
        if(sur_num > 100)
            mice[i][1] = born_num;
        else
        {
            born_num += mice[i-1][6] + mice[i-1][7];
            for(j = 1; j <= m; j++)
                born_num += 2 * mice[i-1][7+j];
            mice[i][1] = born_num;
        }
        for(j = 2; j <= n; j++)
            mice[i][j] = mice[i-1][j-1];
    }
}
void print()
{
    int tal = 0;
    for(int j = 1; j <= n; j++)
        tal += mice[k][j];
    printf("%s: %d\n",s,tal);
}
int main()
{
    //freopen("1532.txt","r",stdin);
    while(scanf("%s",s) && s[0] != '-')
    {
        int i,j;
        Init();
        change();
        solve();
        print();
    }
    return 0;
}

 

 

posted @ 2012-10-09 14:20  sorryhao  阅读(323)  评论(0)    收藏  举报