BZOJ 1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪

本文介绍了一种通过动态规划解决特定组合问题的方法。问题背景是农夫约翰有一系列正方形草皮,需要从中选择四块草皮并将其拆分为1×1的小块,以构成特定面积的区域。文章提供了完整的C++代码实现,并解释了如何通过三维数组进行状态转移。
摘要由CSDN通过智能技术生成

Description

农夫约翰已经从他的牧场中取得了数不清块数的正方形草皮,草皮的边长总是整数(有时农夫约翰割草皮的刀法不合适,甚至切出了边长为0的正方形草皮),他已经把草皮放在了一个奶牛贝茜已经知道的地方。 贝茜总是希望把美味的草皮放到她的秘密庄园里,她决定从这些草皮中取出恰好4块搬到她的秘密庄园中,然后把它们分成1×1的小块,组成一个面积为N(1<=N<=10,000)个单位面积的部分。 贝茜对选出这样四块草皮的方法数很感兴趣,如果她得到了一个4个单位面积的部分,那么她可以有5中不同的方法选4块草皮:(1,1,1,1),(2,0,0,0),(0,2,0,0),(0,0,0,2).顺序是有效的:(4,3,2,1)和(1,2,3,4)是不同的方法。

Input

第一行:一个单独的整数N。

Output

单独的一行包含一个整数,表示贝茜选四块草皮的方案数。

Sample Input

4

Sample Output

5

题解

简单dp。至于答案为什么是四个加起来,我不知道怎么证,但画表可以知道,要加起来。

#include<cstdio> 
#include<cstring> 
#include<algorithm> 
#include<iostream> 
#include<cstdlib> 
#include<cmath> 
using namespace std; 
int n,f[10002][5]; 
int main() 
{ 
    scanf("%d",&n); 
    int i,j,k; 
    f[0][0]=1; 
    for(i=1;i<=n;i++) 
    for(j=1;j<=4;j++) 
    for(k=0;k*k<=i;k++) 
       f[i][j]+=f[i-k*k][j-1]; 
    printf("%d",f[n][1]+f[n][2]+f[n][3]+f[n][4]); 
    return 0; 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值