195: Buyer
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n;
while(cin>>m>>n)
{
int w[1000]={0},v[1000]={0},f[100][100]={0},c[101]={0},k=0;
for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j>=w[i])
{
f[i][j]=max(f[i-1][j],v[i]+f[i-1][j-w[i]]);
}
else f[i][j]=f[i-1][j];
}
}
for(int i=n,j=m;i>=1&&j>=1;i--)
{
if(f[i][j]>f[i-1][j])
{
c[++k]=i;
j=j-w[i];
}
}
cout<<f[n][m]<<endl;
for(int i=k;i>0;i--) cout<<c[i]<<((i==1)?"\n":" ");
}
}
572: Boyer–Moore–Horspool algorithm
#include<bits/stdc++.h>
#include<string>
using namespace std;
int table[26];
int i,j;
int hospl(string str,string text)
{
int lstr=str.length(),ltext=text.length();
for(i=0;i<lstr-1;i++)
{
table[str[i]-'A']=lstr-i-1;
}
int p=lstr-1;
while(p<ltext)
{
int k=0;
while(str[lstr-k-1]==text[p-k]&&k<lstr)
{
k++;
}
if(k==lstr) return p-lstr+1;
else
{
p+=table[text[p]-'A'];
}
}
return -1;
}
int main()
{
string str,text;
cin>>str>>text;
cout<<hospl(str,text)<<endl;
}
697: Edit Distance
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
int d[10005][10005];
int main() {
string strA,strB;
cin>>strA>>strB;
int s1=strA.length();
int s2=strB.length();
for(int i=0;i<=s1;i++)//每行0列
d[i][0]=i;
for(int j= 0;j<=s2;j++)//0行每列
d[0][j]=j;
for(int i=1;i<=s1;i++)
{
for(int j=1;j<=s2;j++)
{
if(strA[i-1]==strB[j-1]) //字符串是从0开始的
d[i][j]=d[i-1][j-1]; //相同不做改变,距离为子问题距离
else
{ //比较上、左、左上,找最小距离 + 1
d[i][j]=min(d[i-1][j-1],min(d[i][j-1],d[i-1][j]))+1;
}
}
}
cout<<d[s1][s2]<<endl;
return 0;
}
1132: Coin-collecting by robot
#include<bits/stdc++.h>
using namespace std;
int arr[1005][1005]; //建立一个map
int Max(int a,int b) //求最大值
{
return a>b?a:b;
}
void MaxValue(int n,int m) //逐行求出最优解
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
arr[i][j]=Max(arr[i-1][j],arr[i][j-1])+arr[i][j];
}
int main()
{
memset(arr,0,sizeof(arr));
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) //从元素位置 1 开始逐列(行)对齐
for(int j=1;j<=m;j++)
scanf("%d",&arr[i][j]);
MaxValue(n,m);
printf("%d\n",arr[n][m]); //最后一个即为最优解
return 0;
}
1139: Coin-row problem
#include<bits/stdc++.h>
using namespace std;
int arr[10005];
int Max(int a,int b) //求最大值
{
return a>b?a:b;
}
void MaxValue(int n)
{
arr[n]=Max(arr[n-1],arr[n-2]+arr[n]);
}
int main()
{
memset(arr,0,sizeof(arr));
int n;
scanf("%d",&n);
for(int i=1;i<n+1;i++)
scanf("%d",&arr[i]);
for(int i=2;i<n+1;i++) //从头开始找出每 i 个硬币的最大金额值
MaxValue(i);
printf("%d\n",arr[n]);
return 0;
}