//导弹,求最长下降子序列长度,注意输出,1PE,o(╯□╰)o
#include<iostream>
using namespace std;
#define M 5000
int height[M+1];
int maxlen[M+1];
int dp(int n)
{
int i,j,tmp;
maxlen[0]=1;
for(i=1;i<n;i++)
{
tmp=0;
for(j=0;j<i;j++)
if(height[i]<height[j] && maxlen[j]>tmp)
tmp=maxlen[j];
maxlen[i]=tmp+1;
}
tmp=1;
for(i=0;i<n;i++)
if(maxlen[i]>tmp)
tmp=maxlen[i];
return tmp;
}
int main()
{
int k,n,t;
k=1;
n=0;
while(scanf("%d",&t)==1 )
{
if(t==-1 )
{
if(n==0) return 0;
else {
printf("Test #%d:\n maximum possible interceptions: %d\n\n",k,dp(n));
memset(height,0,sizeof(height));
memset(maxlen,0,sizeof(maxlen));
n=0;
k++;
}
} else height[n++]=t;
}
return 0;
}
posted @
2009-05-23 18:35 wyiu 阅读(70) |
评论 (0) |
编辑 收藏
//标准LCS,把一个j写成i导致3RE,o(╯□╰)o
#include<iostream>
#include<string>
using namespace std;
#define M 800
char stra[M+1];
char strb[M+1];
int cs[M+1][M+1];
int m,n;
void LCS()
{
int i,j;
m=strlen(stra+1);
n=strlen(strb+1);
for(i=0;i<=m;i++)
cs[i][0]=0;
for(j=0;j<=n;j++)
cs[0][j]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(stra[i]==strb[j]) cs[i][j]=cs[i-1][j-1]+1;
else cs[i][j]=max(cs[i-1][j],cs[i][j-1]);
}
int main()
{
while(scanf(" %s %s",stra+1,strb+1)!=EOF)
{
LCS();
printf("%d\n",cs[m][n]);
}
return 0;
}
posted @
2009-05-20 13:45 wyiu 阅读(88) |
评论 (0) |
编辑 收藏
//害我没睡好觉,靠,烂
#include<iostream>
using namespace std;
#define M 20
int res[M+1][M+1][M+1];
void dp()
{
int i,j,k;
for(i=0;i<=20;i++)
for(j=0;j<=20;j++)
res[i][j][0]=1;
for(j=0;j<=20;j++)
for(k=0;k<=20;k++)
res[0][j][k]=1;
for(i=0;i<=20;i++)
for(k=0;k<=20;k++)
res[i][0][k]=1;
for(i=1;i<=20;i++)
for(j=1;j<=20;j++)
for(k=1;k<=20;k++)
if(i<j && j<k)
res[i][j][k]=res[i][j][k-1]+res[i][j-1][k-1]-res[i][j-1][k];
else res[i][j][k]=res[i-1][j][k]+res[i-1][j-1][k]+res[i-1][j][k-1]-res[i-1][j-1][k-1];
}
int main()
{
int a,b,c;
dp();
while(scanf("%d%d%d",&a,&b,&c)==3 )
{
if(a==-1 && b==-1 && c==-1) return 0;
else {
if(a<=0 || b<=0 || c<=0)
printf("w(%d, %d, %d) = %d\n",a,b,c,1);
else {
if(a>20 || b>20 || c>20)
printf("w(%d, %d, %d) = %d\n",a,b,c,res[20][20][20]);
else printf("w(%d, %d, %d) = %d\n",a,b,c,res[a][b][c]);
}
}
}
return 0;
}
posted @
2009-05-20 13:43 wyiu 阅读(75) |
评论 (0) |
编辑 收藏
//略
#include<iostream>
using namespace std;
int a[100][100];
int n;
int i,j;
void dp()
{
for(i=n-2;i>=0;i--)
for(j=0;j<=i;j++)
a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
scanf("%d",&a[i][j]);
dp();
printf("%d\n",a[0][0]);
return 0;
}
posted @
2009-05-19 01:20 wyiu 阅读(97) |
评论 (0) |
编辑 收藏
//黑书有介绍,参考,但要添加对相应串的存储,黑书的代码有可改进的...
#include<iostream>
#include<string>
using namespace std;
#define INF 2000000000
char str[102];
int d[102][102];
string ans[102][102];
void dp()
{
int i,j,k,p,n;
n=strlen(str+1);
for(i=1;i<=n;i++)
{
d[i][i-1]=0;
d[i][i]=1;
if(str[i]=='(') ans[i][i]="()";
if(str[i]==')') ans[i][i]="()";
if(str[i]=='[') ans[i][i]="[]";
if(str[i]==']') ans[i][i]="[]";
}
for(p=1;p<n;p++)
{
for(i=1;i<=n-p;i++)
{
j=i+p;
d[i][j]=INF;
if(str[i]=='(' && str[j]==')')
{
if(d[i+1][j-1]<d[i][j])
{
d[i][j]=d[i+1][j-1];
ans[i][j]='('+ans[i+1][j-1]+')';
}
}
else {
if(str[i]=='[' && str[j]==']')
{
if(d[i+1][j-1]<d[i][j])
{
d[i][j]=d[i+1][j-1];
ans[i][j]='['+ans[i+1][j-1]+']';
}
}
}
for(k=i;k<=j-1;k++)
{
if(d[i][k]+d[k+1][j]<d[i][j])
{
d[i][j]=d[i][k]+d[k+1][j];
ans[i][j]=ans[i][k]+ans[k+1][j];
}
}
}
}
cout<<ans[1][n]<<endl;
}
int main()
{
scanf("%s",str+1);
dp();
return 0;
}
posted @
2009-05-19 01:00 wyiu 阅读(274) |
评论 (0) |
编辑 收藏
#include<iostream>
#include<math.h>
using namespace std;
#define MAX 100
double A[MAX+1][MAX+1];
double B[MAX+1];
double X[MAX+1];
double Z[MAX+1];
int D[MAX+1]; //未知变量位置的变化
int n;
int e;
void input()
{
int i,j;
printf("n:");
scanf("%d",&n);
printf("A[][]:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%lf",&A[i][j]);
printf("B[]:\n");
for(i=1;i<=n;i++)
scanf("%lf",&B[i]);
printf("e:");
scanf("%lf",&e);
}
void SwapE(double a,double b) //swap elements
{
double T;
T=a;
a=b;
b=T;
}
void SwapR(int k,int kmi)
{
int j;
for(j=k;j<=n;j++)
SwapE(A[k][j],A[kmi][j]);
}
void SwapC(int k,int kmj)
{
int i;
for(i=k;i<=n;i++)
SwapE(A[i][k],A[i][kmj]);
}
void AllGaussianElimination()
{
int kmi,kmj;//the i and j of the max(abs) element when k
int i,j,k;
double T;
for(i=1;i<=n;i++)//初始化位置变量位置
D[i]=i;
for(k=1;k<=n-1;k++)
{
//选主元
T=0;
for(i=k;i<=n;i++)
for(j=k;j<=n;j++)
if(fabs(A[i][j])>T) { T=fabs(A[i][j]); kmi=i;kmj=j;}
if(T<=e) {printf("Error!\n"); return ;}
if(kmi!=k) { SwapR(k,kmi); SwapE(B[k],B[kmi]); }
if(kmj!=k) { SwapC(k,kmj); SwapE(D[k],D[kmj]); }
//消元
for(i=k+1;i<=n;i++)
{
T=A[i][k]/A[k][k];
B[i]-=T*B[k];
for(j=k;j<=n;j++)
A[i][j]-=T*A[k][j];
}
//回代
if(A[n][n]<=e) {printf("Error!\n");return ;}
Z[n]=B[n]/A[n][n];
double S_Aij_Zj;
for(i=n-1;i>=1;i--)
{
S_Aij_Zj=0;
for(j=i+1;j<=n;j++)
S_Aij_Zj+=A[i][j]*Z[j];
Z[i]=(B[i]-S_Aij_Zj)/A[i][i];
}
for(j=1;j<=n;j++)
X[D[j]]=Z[j];
}
}
void print(double X[])
{
int i;
printf("X[]:\n");
for(i=1;i<=n;i++)
printf("%f\n",X[i]);
}
int main()
{
input();
AllGaussianElimination();
print(X);
system("pause");
return 0;
}
posted @
2009-05-16 16:37 wyiu 阅读(782) |
评论 (0) |
编辑 收藏
#include<iostream>
#include<math.h>
using namespace std;
#define MAX 100
double A[MAX+1][MAX+1];
double B[MAX+1];
double X[MAX+1];
double e;
int n;
void ColGaussianElimination()
{
int i,j,k,kmi;
double T;
for(k=1;k<=n-1;k++)
{
//选主元
T=0;
for(i=k;i<=n;i++)
if( fabs(A[i][k])> T ){ T=A[i][k];kmi=i;}
if( T<=e) { printf("Error!\n"); return ;}
if(kmi!=k)
{
T=B[k];B[k]=B[kmi];B[kmi]=T; //swap B[k] and B[kmi]
for(j=k;j<=n;j++) //swap row kmi and k of A
{
T=A[k][j];
A[k][j]=A[kmi][j];
A[kmi][j]=T;
}
}
//消元
for(i=k+1;i<=n;i++)
{
T=A[i][k]/A[k][k];
B[i]-=T*B[k];
for(j=k;j<=n;j++)
A[i][j]-=T*A[k][j];
}
}
//回代
if( fabs(A[n][n])<=e ) { printf("Error!\n"); return ;}
X[n]=B[n]/A[n][n];
double S_Aij_Xj;
for(i=n-1;i>=1;i--)
{
S_Aij_Xj=0;
for(j=i+1;j<=n;j++)
S_Aij_Xj+=A[i][j]*X[j];
X[i]=(B[i]-S_Aij_Xj)/A[i][i];
}
}
void print(double X[])
{
int i;
printf("X[]:\n");
for(i=1;i<=n;i++)
printf("%f\n",X[i]);
}
int main()
{
int i,j;
printf("n:");
scanf("%d",&n);
printf("A[][]:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%lf",&A[i][j]);
printf("B[]:\n");
for(i=1;i<=n;i++)
scanf("%lf",&B[i]);
printf("e:");
scanf("%lf",&e);
ColGaussianElimination();
print(X);
system("pause");
return 0;
}
posted @
2009-05-16 16:34 wyiu 阅读(610) |
评论 (0) |
编辑 收藏
#include<iostream>
#include<math.h>
using namespace std;
#define MAX 100
double A[MAX+1][MAX+1];
double B[MAX+1];
double X[MAX+1];
double e;
int n;
void OrderGaussianElimination()
{
int i,j,k;
double T;
//消元
for(k=1;k<=n-1;k++)
{
if( fabs(A[k][k])<=e ) { printf("Error!\n"); return ;}
for(i=k+1;i<=n;i++)
{
T=A[i][k]/A[k][k];
B[i]-=T*B[k];
for(j=k;j<=n;j++)
A[i][j]-=T*A[k][j];
}
}
//回代
if( fabs(A[n][n])<=e ) { printf("Error!\n"); return ;}
X[n]=B[n]/A[n][n];
double S_Aij_Xj;
for(i=n-1;i>=1;i--)
{
S_Aij_Xj=0;
for(j=i+1;j<=n;j++)
S_Aij_Xj+=A[i][j]*X[j];
X[i]=(B[i]-S_Aij_Xj)/A[i][i];
}
}
void print(double X[])
{
int i;
printf("X[]:\n");
for(i=1;i<=n;i++)
printf("%f\n",X[i]);
}
int main()
{
int i,j;
printf("n:");
scanf("%d",&n);
printf("A[][]:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%lf",&A[i][j]);
printf("B[]:\n");
for(i=1;i<=n;i++)
scanf("%lf",&B[i]);
printf("e:");
scanf("%lf",&e);
OrderGaussianElimination();
print(X);
return 0;
}
posted @
2009-05-16 16:32 wyiu 阅读(227) |
评论 (0) |
编辑 收藏
摘要: 编写将十字链表表示的矩阵A转置的程序算法,转置结果为另一个十字链表,并将该转置矩阵以三元组(i,j,value)的形式输出。
1#include<iostream> 2using namespace std; 3#define MAX 100 4 ...
阅读全文
posted @
2009-05-13 17:06 wyiu 阅读(940) |
评论 (0) |
编辑 收藏
输入二叉树
先序,建树,然后
中序线索化,遍历输出
1#include<iostream>
2using namespace std;
3
4enum PointerTag
5{
6 Link,Thread //枚举值Link和Thread分别为0,1
7};
8
9struct BiThrNode //线索二叉树的结点类型
10{
11 char data;
12 PointerTag LTag; //左标志
13 PointerTag RTag; //右标志
14 BiThrNode *lchild; //左孩子指针
15 BiThrNode *rchild; //右孩子指针
16};
17
18typedef BiThrNode* BiThrTree;
19BiThrNode *pre=NULL; //全局量
20
21void InOrderThreading(BiThrTree & Thrt,BiThrTree T);//线索化
22void InThreading(BiThrTree p);//中序遍历线索化
23bool PreOrderCreatBiTree(BiThrTree &T);//先序建立树
24void InOrderTraverse_Thr(BiThrTree T);//中序遍历线索树
25
26int main()
27{
28 BiThrTree T,Thrt;
29 printf("输入先序序列('#'表示空节点)建立二叉树:\n");
30 PreOrderCreatBiTree(T);//先序建立树
31 InOrderThreading(Thrt,T);//中序线索化
32 printf("中序线索化,中序遍历得中缀式:\n");
33 InOrderTraverse_Thr(Thrt);//中序遍历线索树
34 printf("\n");
35 return 0;
36}
37
38void InOrderThreading(BiThrTree & Thrt,BiThrTree T)
39{
40 Thrt=new BiThrNode;
41 Thrt->LTag=Link;
42 Thrt->RTag=Thread;
43 Thrt->rchild=Thrt;
44 if(!T) Thrt->lchild=Thrt;
45 else{
46 Thrt->lchild=T;
47 pre=Thrt;
48 InThreading(T);
49 pre->rchild=Thrt;
50 pre->RTag=Thread;
51 Thrt->rchild=pre;
52 }
53}
54
55void InThreading(BiThrTree p)
56{
57 if(p)
58 {
59 InThreading(p->lchild);
60 if(!p->lchild){ p->LTag=Thread; p->lchild=pre;}
61 if(!pre->rchild){ pre->RTag=Thread; pre->rchild=p; }
62 pre=p;
63 InThreading(p->rchild);
64 }
65}
66
67bool PreOrderCreatBiTree(BiThrTree &T)
68{//该节点非空返回true,双亲节点对应标志Link,空时返回false,双亲节点对应标志应为Thread
69 char ch;
70 scanf("%c",&ch);
71 if(ch=='#')
72 {
73 T=NULL;
74 return false;
75 }else {
76 T=new BiThrNode;
77 T->data=ch;
78 if(PreOrderCreatBiTree(T->lchild)) T->LTag=Link; //左孩子存在则左标志为Link
79 else T->LTag=Thread;
80 if(PreOrderCreatBiTree(T->rchild)) T->RTag=Link; //右孩子存在则右标志为Link
81 else T->RTag=Thread;
82 }
83 return true;
84}
85
86
87void InOrderTraverse_Thr(BiThrTree T)
88{
89 BiThrNode *p;
90 p=T->lchild;
91 while(p!=T)
92 {
93 while(p->LTag==Link) p=p->lchild;
94 printf("%c",p->data);
95 while(p->RTag==Thread && p->rchild!=T) //if(p->RTag==Thread && p->rchild!=T)
96 {
97 p=p->rchild;
98 printf("%c",p->data);
99 }
100 p=p->rchild;
101 }
102}
posted @
2009-05-13 17:00 wyiu 阅读(608) |
评论 (0) |
编辑 收藏