poj1221 2010.2.17
2016-02-05 14:16
204 查看
poj1221 2010.2.17
题意:
给一个正整数,求出它的UnimodalPalindromic的个数,所谓的Unimodal Palindromic就是一系列数,单调递增再递减,并且第一个和最后一个数相同,第二个跟倒数第二个数相同,即第i个跟第n-i+1个数相同
思路:
完全没思路,感觉跟DP扯不上半点关系,后来网上找了些解题报告研究一下午才搞出来。这个题做得很猥琐。
把它的UnimodalPalindromic分成两部分:一部分是最小数是j的,就是第一个跟最后一个数等于j的有几个;第二部分是最小数大于j的,可以是j+1,j+2…..的有几个。
s[i][j]表示和为i,最小数是j的序列的个数。那么第一部分就是s[i-j*2][j],
意思就是和为去掉了首尾两个数后的和,最小数是j;第二部分就是s[i][j+1].最小数大于j的情况的个数。状态转移方程:
s[i][j] = s[i-2*j] + s[i][j+1]
初始化:
①.s[0][j]初始值1.因为当需要调用s[0][j]时,表示拆成了两个相同的数。有一个
②.S[i][j](i<j)初始值0,不可能的情况
③.S[i][j] (i>=j >i/2) 初始值1,j>i/2时所有s[i][j]都是1,那个就是i本身。
题意:
给一个正整数,求出它的UnimodalPalindromic的个数,所谓的Unimodal Palindromic就是一系列数,单调递增再递减,并且第一个和最后一个数相同,第二个跟倒数第二个数相同,即第i个跟第n-i+1个数相同
思路:
完全没思路,感觉跟DP扯不上半点关系,后来网上找了些解题报告研究一下午才搞出来。这个题做得很猥琐。
把它的UnimodalPalindromic分成两部分:一部分是最小数是j的,就是第一个跟最后一个数等于j的有几个;第二部分是最小数大于j的,可以是j+1,j+2…..的有几个。
s[i][j]表示和为i,最小数是j的序列的个数。那么第一部分就是s[i-j*2][j],
意思就是和为去掉了首尾两个数后的和,最小数是j;第二部分就是s[i][j+1].最小数大于j的情况的个数。状态转移方程:
s[i][j] = s[i-2*j] + s[i][j+1]
初始化:
①.s[0][j]初始值1.因为当需要调用s[0][j]时,表示拆成了两个相同的数。有一个
②.S[i][j](i<j)初始值0,不可能的情况
③.S[i][j] (i>=j >i/2) 初始值1,j>i/2时所有s[i][j]都是1,那个就是i本身。
#include <string.h> #include <stdio.h> #define N 300 int main() { int i,j; int n; unsigned int s ; memset(s,0,sizeof(s)); for(i=1;i<N;i++) s[0][i]=1; for(i=1;i<N;i++) for(j=i/2+1;j<=i;j++) s[i][j]=1; for(i=2;i<N;i++) for(j=i/2;j>0;j--) s[i][j]=s[i-2*j][j]+s[i][j+1]; while (scanf("%d",&n),n) printf("%d %u\n",n,s [1]); return 0; }
相关文章推荐
- 项目中遇到的问题
- 蓝桥杯学习记录-基础练习
- linux命令行下如何以目录树的形式显示一个文件夹的所有文件
- 通知:转移至简书
- PAT (Basic Level)1009. 说反话
- Angular-JS初见
- [转] AT指令(打电话与发短信)
- 计算机网络的类别
- Python错误: SyntaxError: Non-ASCII character
- uva1420
- 零基础汇编学习笔记
- Clion安装激活
- 常指针与常引用
- Myeclipse没有代码提示怎么办
- 相煎何太急:微信QQ彻底分家!
- Android开发笔记(五十六)摄像头拍照
- [Polya] BZOJ 1488 图的同构
- poj 3007 Organize Your Train part II(字符串哈希)
- 利用Delphi编写Socket通信程序
- 有已排好序的数组,要求输入数后按原来排序规律插入数组中