poj2081

 1 //Accepted    11880 KB    0 ms
 2 //dp 模拟
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <iostream>
 6 using namespace std;
 7 const int imax_n = 500005;
 8 const int imax_flag = 10000000;
 9 int a[imax_n];
10 bool flag[imax_flag];
11 void Dp()
12 {
13     memset(flag,0,sizeof(flag));
14     a[0]=0;
15     flag[0]=1;
16     for (int i=1;i<imax_n;i++)
17     {
18         int temp=a[i-1]-i;
19         if (temp>0 && flag[temp]==0)
20         a[i]=temp;
21         else
22         a[i]=a[i-1]+i;
23         flag[a[i]]=1;
24     }
25 }
26 int main()
27 {
28     int n;
29     Dp();
30     while (scanf("%d",&n),n+1)
31     {
32         printf("%d\n",a[n]);
33     }
34     return 0;
35 }

poj2081,布布扣,bubuko.com

时间: 2024-10-29 19:09:14

poj2081的相关文章

DP总结 ——QPH

常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一头压入元素. 队列中维护的是两个值.一个是位置,这和k的范围有关系,另外一个是f(k)的值,这个用来维护单调性,当然如果f(k)的值可以利用dp值在O(1)的时间内计算出来的话队列中可以只维护一个表示位置的变量. 枚举到一个i的时候,首先判断队首元素的位置是否已经不满足k的范围了,如果不满足就将队首