- 给定两个字符串ch1 abcdef和ch2 atbtttc。求他们最长的公共子序列的长度。我们定义一个maxLen(i,j)表示ch1[i-1]和ch2[j-1]的长度。
- 当ch1[i-1]==ch[j-1] maxLen[i][j]=maxLen[i-1][j-1]+1
- 当ch1[i-1]!=ch[j-1] maxLen[i][j]=MAX(maxLen[i-1][j],maxLen[i][j-1])
- #include
using namespace std;
int longestString(char *ch1, char *ch2)
{
int length1 = strlen(ch1);
int length2 = strlen(ch2);
int *maxLongest = new int[length1+1];
for (int i = 0; i < length1+1; i++)
{
maxLongest[i] = new int[length2+1];
}
for (int i = 0; i <= length1; i++)
{
maxLongest[i][0] = 0;
}
for (int i = 0; i <= length2; i++)
{
maxLongest[0][i] = 0;
}
for (int i = 1; i <= length1; i++)
{
for (int j = 1; j <= length2; j++)
{
if (ch1[i-1] == ch2[j-1])
{
maxLongest[i][j] = maxLongest[i - 1][j - 1] + 1;
}
else
{
if (maxLongest[i - 1][j] > maxLongest[i][j - 1])
{
maxLongest[i][j] = maxLongest[i - 1][j];
}
else
{
maxLongest[i][j] = maxLongest[i][j - 1];
}
}
}
}
return maxLongest[length1][length2];
}
int main()
{
char *ch1 = “abcfbc”;
char *ch2 = “tttttt”;
cout << longestString(ch1, ch2) << endl;
system(“pause”);
return 0;
}
动态规划,常常学啊。
c++11的原子操作
不使用原子操作:
#include
#include
#include
#include<windows.h>
using namespace std;
int sum = 0;
void func()
{
Sleep(100);
for (int i = 0; i < 1000; i++)
{
sum += i;
}
}
int main()
{
std::thread t1[10];
for (int i = 0; i < 10; i++)
{
t1[i] = std::thread(func);
}
for (int i = 0; i < 10; i++)
{
t1[i].join();
}
cout << "sum = " << sum << endl;
system(“pause”);
return 0;
}
执行一千次有一千个sum
我们如果对sum使用原子变量,俺么就不会出现上述的情况。
#include
#include
#include
#include<windows.h>
using namespace std;
std::atomic_long sum = 0;
//long sum = 0;
void func()
{
Sleep(100);
for (int i = 0; i < 1000; i++)
{
sum += i;
}
}
int main()
{
std::thread t1[10];
for (int i = 0; i < 10; i++)
{
t1[i] = std::thread(func);
}
for (int i = 0; i < 10; i++)
{
t1[i].join();
}
cout << "the sum = " << sum << endl;
system("pause");
return 0;
}
这样就可以得到正确的结果
原子意味着不可分割。确保每个线程拿到的数据是独一无二的。可以用数组表示的多线程算法设计的时候,可以使用。或者计算当前的线程数量。