加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ PKU 2537 Tight Words 动态规划 精度

(2010-05-11 16:40:02)
标签:

poj

pku

2537

it

分类: 动态规划

题目描述:

一段文章仅由0 ~k   k + 1个数字组成,要求相邻两个数字的差值不能大于1.

问文章长度n时,合法的文章占所有文章的百分比。

解题报告:

dp[i][j] = dp[i - 1][j] + dp[i - 1][j + 1] + dp[i - 1][j - 1];

dp[i][j]表示文章第i个数字是j时的情况种数。

那么第i位的数字种数的和sum,再除以所有种数(k+1)^n就是答案。

精度问题:只需要直接用double就可以了,它的有效数字的位数满足条件。

代码如下:

#include<iostream>
#include<cmath>
using namespace std;
int k, n;
double dp[101][10], ans[101][10];
int main()
{
    for(int i = 0; i <= 9; i++)
    {
        for(int j = 0; j <= i; j++)
            dp[1][j] = ans[1][j] = 1;
        for(int j = 2; j <= 100; j++)
        {
            double sum = 0;
            for(int k = 0; k <= i; k++)
            {
                dp[j][k] = dp[j - 1][k];
                if (k - 1 >= 0) dp[j][k] += dp[j - 1][k - 1];
                if (k + 1 <= i) dp[j][k] += dp[j - 1][k + 1];
                sum += dp[j][k];
            }
            ans[j][i] = sum / pow((i + 1) * 1.0, j * 1.0);
        }
    }
    while(scanf("%d%d", &k, &n) != EOF)
        printf("%.5f\n", ans[n][k] * 100);
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有