begin
readln(n);
fori:
=1tondoread(t[i]);
fori:
=1ton-1doread(r[i]);
f[0]:
=0;f[1]:
=t[1];
fori:
=2tondo
f[i]:
=min(f[i-1]+t[i],f[i-2]+r[i-1]);
writeln(f[n]);
end.
伪代码
BuyTicks(T,R)
1n←length[T]
2f[0]←0
3f[1]←T[1]
4fori←2tondo
5f[i]←f[i-2]+R[i-1]
6iff[i]>f[i-1]+T[i]then
7f[i]←f[i-1]+T[i]
8returnf
5-8最大子段和问题
#include
#include
intmax_sum(intn,int*a,int*besti,int*bestj){
int*b=(int*)malloc(n*sizeof(int));
intsum=0;inti=-1;inttemp=0;
for(i=0;i<=n-1;i++){
if(temp>0)
temp+=a[i];
else
temp=a[i];
b[i]=temp;
}
sum=b[0];
for(i=1;i<=n-1;i++){
if(sum
sum=b[i];
*bestj=i;
}
}
for(i=*bestj;i>=0;i--){
if(b[i]==a[i]){
*besti=i;
break;
}
}
free(b);
returnsum;
}
intmain(void)
{
inta[]={-2,1,-4,13,-5,-2,-10,20,100};
intlength=sizeof(a)/sizeof(int);
intsum=-1;
intbesti=-1;
intbestj=-1;
sum=max_sum(length,a,&besti,&bestj);
printf("besti=%d,bestj=%d,max_sum=%d\n",besti,bestj,sum);
return0;
}
5-9装箱问题
发现就是0-1背包问题每个物品的体积就是花费同时也是价值,也就是说这题可以转化为在总体积为w下,可以得到最大的价值最后用总体积减去最大的价值就是剩下最少的空间状态转移方程d[j]=max(d[j],d[j-a[i]]+a[i]);
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
输出格式 一个整数,表示箱子剩余空间。
#include#include
usingnamespacestd;
intn;
intd[20005];
inta[35];
intmain(){
intw;
scanf("%d%d",&w,&n);
inti,j;
for(i=0;i scanf("%d",&a[i]);
}
memset(d,0,sizeof(d));
for(i=0;i for(j=w;j>=a[i];j--)
d[j]=max(d[j],d[j-a[i]]+a[i]);
}
printf("%d\n",w-d[w]);
return0;
}
6-10表格乘法
#include"stdio.h"#definenum50
voidchengji_1(int(*a)[num][3],intn,charb[]);
int_tmain(){
inta[num][num][3];
charb[num];
inti,j,k,n;
charc;
printf("intputthenumofarray:
");
scanf("%d",&n);
getchar();
for(i=0;i for(j=0;j for(k=0;k<3;k++)
a[i][j][k]=0;
i=0;
while((c=getchar())!
='/n')
{
b[i]=c;i++;
}
chengji_1(a,n,b);
printf("reslutis:
%d",a[0][n-1][0]);
getchar();
}
voidchengji_1(int(*a)[num][3],intn,charb[]){
inti,j,k,t;
for(i=0;i *(*(*(a+i)+i)+(b[i]-'a'))=1;
for(k=1;k for(i=0;i {
j=i+k;
for(t=i;t {
*(*(*(a+i)+j)+0)+=((*(*(*(a+i)+t)+0))*(*(*(*(a+t+1)+j)+2))+(*(*(*(a+i)+t)+1))*(*(*(*(a+t+1)+j)+2))+(*(*(*(a+i)+t)+2))*(*(*(*(a+t+1)+j)+0)));
*(*(*(a+i)+j)+1)+=((*(*(*(a+i)+t)+0))*(*(*(*(a+t+1)+j)+0))+(*(*(*(a+i)+t)+0))*(*(*(*(a+t+1)+j)+1))+(*(*(*(a+i)+t)+1))*(*(*(*(a+t+1)+j)+1)));
*(*(*(a+i)+j)+2)+=((*(*(*(a+i)+t)+1))*(*(*(*(a+t+1)+j)+0))+(*(*(*(a+i)+t)+2))*(*(*(*(a+t+1)+j)+1))+(*(*(*(a+i)+t)+2))*(*(*(*(a+t+1)+j)+2)));
} }
}
11最长滑雪道问题
#include
usingnamespacestd;
intdata[102][102],longetr[102][102];
intm,n;
intcal(inti,intj){
intmax=0;
if(longetr[i][j]>0)
//如果该点已经计算过直接返回路径长度,保存已有的计算结果这是动态规划优越之处
returnlongetr[i][j];
if(j-1>=0&&data[i][j]>data[i][j-1]&&max max=cal(i,j-1);//向左走
if(j+1data[i][j+1]&&max max=cal(i,j+1);//向右走
if(i-1>=0&&data[i][j]