OpenJudge(1221)——UNIMODAL PALINDROMIC DECOMPOSITIONS

本文深入探讨了UnimodalPalindromic序列的特性,通过动态规划方法,揭示了如何计算序列的组成情况。文章详细介绍了问题的解决思路,包括动态规划矩阵的构建和更新过程,最终通过实例展示了如何解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

现在给你一个叫Unimodal Palindromic序列的东西,它符合是回文串并且它是峰型的,峰型意味着它就是先递增再递减。

思路:

一开始没思路,后来尝试着找思路,但是打表打出来之后发现有一些问题。因为没有限制条件,于是会发生有重复的现象。于是设dp[i][j]表示当和为i时,而且这个序列中的最小的那个数是大于等于j的时候所能够组成的情况数有几个

于是dp[i][j]=dp[i-j*2][j]+dp[i][j+1]; 这里j相当于是每次取的那个最小的数,比如说1,2,3....到i/2为止。而dp[i][j+1]则是用来进行累加操作的,并且dp[i][j]=1,(i>=j>i/2);这些都预处理成1。同时将dp[i][j]=0,(j>i)。 将dp[0][i]=1,这里是表示一个数完全拆成了两个相等的数,那么结果当然是1个了。

感觉其实就是一道找规律的题嘛~和dp好像没有多大关系。。

参考

 

#include<cstdio>
#include<cstring>
#include<set>
#include<cmath>
#include<map>
#include<stack>
#include<string>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define inf 99999999
#define maxn 300
ll dp[maxn][maxn];
int main(){
    dp[1][1]=1;
    for(int i=0;i<251;i++) dp[0][i]=1;
    for(int i=2;i<=250;i++){
        for(int j=i+1;j<=250;j++) dp[i][j]=0;
        for(int j=i/2+1;j<=i;j++) dp[i][j]=1;
        for(int j=i/2;j>=1;j--){
            dp[i][j]=dp[i-j*2][j]+dp[i][j+1];
        }
    }
    int n;
    while(~scanf("%d",&n)){
        if(n==0) break;
        printf("%d %lld\n",n,dp[n][1]);
    }
    return 0;
}
/*
2
3
4
5
6
7
8
10
23
24
131
213
92
0
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值