学习心得(code)

superlong@CoreCoder

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

公告

文字可能放在http://blog.csdn.net/superlong100,此处存放代码

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新随笔

最新评论

  • 1. re: Poj 1279
  • 对于一个凹多边形用叉积计算面积 后能根据结果的正负来判断给的点集的时针方向?
  • --bsshanghai
  • 2. re: Poj 3691
  • 你写的这个get_fail() 好像并是真正的get_fail,也是说fail指向的串并不是当前结点的子串。为什么要这样弄呢?
  • --acmer1183
  • 3. re: HDU2295[未登录]
  • 这个是IDA* 也就是迭代加深@ylfdrib
  • --superlong
  • 4. re: HDU2295
  • 评论内容较长,点击标题查看
  • --ylfdrib
  • 5. re: HOJ 11482
  • 呵呵..把代码发在这里很不错..以后我也试试...百度的编辑器太烂了....
  • --csuft1

阅读排行榜

评论排行榜

#include <iostream>
#include 
<string.h>
using namespace std;

char s[257];
int  num[257][6], l, ans, flag, end, test;
int f[257][900000];
int fd[257][900000];

void pre()
{
    
int base = 1, i, j, k;
    ans 
= 0;
    flag 
= 0;
    l 
= strlen(s) - 1;
    
while(s[l] != '=')
    {
        ans 
+= (s[l] - '0'* base;
        
base *= 10;
        l 
--;
    }
    
//printf("ans = %d\n",ans);
    memset(num,0,sizeof(num));
    
for(i= 0; i < l; i ++)
    {
        
int temp = 0;
        
for(j = 0; j < 5; j ++)
        
if(i + j < l)
        {
            temp 
= temp * 10 + s[i + j] - '0';
            num[i][j] 
= temp;
            
//printf("%d ",temp);
        }    
        
//puts("");
    }
}

void out()
{
    
int pos, sum, ll, tp, ts, a[300];
    pos 
= l;
    sum 
= ans;
    ll 
= -1;
    
    
while(pos >= 0)
    {
        
//printf("%d\n",pos);
        tp = fd[pos][sum];
        ts 
= pos - 1 - tp;
        a[
++ll] = num[tp][ts];
        ts 
= sum - num[tp][ts];
        pos 
= tp;    sum = ts;
    }
    printf(
"%d. %d",++test, a[ll-1]);
    
for(int i = ll-2; i >= 0; i --)printf("+%d", a[i]);
    printf(
"=%d\n",ans);
}

void dp()
{
    
int i, j, k;
    
char temp;
    
for(i = 0; i <= l; i ++)
    
for(j = 0; j <= ans; j ++)
        f[i][j] 
= -1;
    fd[
0][0= -1;
    f[
0][0= 0;
    
for(i = 0; i <= l;  i ++)
    {
        
for(j = 0; j <= ans; j ++)
        
if(f[i][j] >= 0)
        {
            
for(k = 0; k < 5; k ++)
            
if(j + num[i][k] <= ans && num[i][k])
            {
                temp 
= f[i + k + 1][j + num[i][k]];
                
if(temp < 0 || temp > f[i][j] + 1)
                {
                    f[i 
+ k + 1][j + num[i][k]] = f[i][j] + 1;
                    fd[i 
+ k + 1][j + num[i][k]] = i;
                }
            }
        }
    }
    
//for(i=0;i<=l;i++){for(j=0;j<=ans;j++)printf("%d ",f[i][j]);puts("");}
    if(f[l][ans] > 0)
    {
        
out();
        
//printf("%d\n",f[l][ans]);
    }
    
else
    {
        printf(
"%d. IMPOSSIBLE\n",++test);
    }
}

int main()
{
    test 
= 0;
    freopen(
"in.txt","r",stdin);
    
while(gets(s) != NULL)
    {
        
if(!strcmp(s, "0=0")) break;
        pre();
        dp();
    }    
    
//puts("s");
    while(1);
}

posted on 2009-08-19 17:26 superlong 阅读(83) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理