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; }

浙公网安备 33010602011771号